source

'var' 매개 변수는 더 이상 사용되지 않으며 Swift 3에서 제거됩니다.

ittop 2023. 5. 22. 21:38
반응형

'var' 매개 변수는 더 이상 사용되지 않으며 Swift 3에서 제거됩니다.

좋아요, 그래서 저는 Xcode를 7.3으로 업데이트하고 이제 다음 경고를 받습니다.

'var' 매개 변수는 더 이상 사용되지 않으며 Swift 3에서 제거됩니다.

이 기능에서 변수를 사용해야 할 때 이 문제를 해결하는 방법:

public func getQuestionList(var language: String) -> NSArray {
    if self.data.count > 0 {
        if (language.isEmpty) {
            language = "NL"
        }
        return self.data.objectForKey("questionList" + language) as! NSArray
    }

    return NSArray()
}

함수 매개변수에서 Var를 제거하는 것에 대한 논의는 GitHub: Remove Var Parameters의 이 제출물에 완전히 문서화되어 있습니다.

그 문서에서 당신은 사람들이 종종 혼동한다는 것을 발견할 것입니다.var가 있는 파라미터:inout매개 변수avar 것을 매변수단매함맥수의안락반가에면것의변을는미하서는개라적이가는개수변순히▁an▁is,▁parameter▁parameter▁simply,inoutparameter 반환점의 파라미터 값은 함수에서 호출자의 컨텍스트로 복사됩니다.

이 문제를 해결하는 올바른 방법은 제거하는 것입니다.var 매에서로소개합니다컬을변수개를 합니다.var변수. 의 맨 에서 매개을 해당합니다.루틴의 맨 위에서 매개 변수 값을 해당 변수에 복사합니다.

새 변수에 할당하려고 시도했습니까?

public func getQuestionList(language: String) -> NSArray {
    var lang = language
    if self.data.count > 0 {
        if (lang.isEmpty) {
            lang = "NL"
        }
        return self.data.objectForKey("questionList" + lang) as! NSArray
    }

    return NSArray()
}

함수의 시작 부분에 이 한 줄만 추가하면 됩니다.

var language = language

나머지 코드는 변경되지 않고 다음과 같이 유지할 수 있습니다.

public func getQuestionList(language: String) -> NSArray {
    var language = language
    if self.data.count > 0 {
        if (language.isEmpty) {
            language = "NL"
        }
        return self.data.objectForKey("questionList" + language) as! NSArray
    }

    return NSArray()
}

많은 사람들이 제안하고 있습니다.inout매개 변수입니다. 하지만 그것은 정말로 그들이 의도한 것이 아닙니다.게다가, 그것은 함수를 호출하는 것을 허용하지 않습니다.let상수이며 문자열 리터럴을 사용하지 않습니다.기본값을 함수 서명에 추가하는 것이 어떻습니까?

public func getQuestionList(language language: String = "NL") -> NSArray {
    if data.count > 0 {
        return data.objectForKey("questionList" + language) as! NSArray
    } else {
        return NSArray()
    }
}

그냥 전화하지 않도록 하세요.getQuestionList기본 언어를 원할 경우를 대비하여 빈 문자열을 사용하되 매개 변수는 생략합니다.

let list = getQuestionList() // uses the default "NL" language
public func getQuestionList(language: inout String) -> NSArray {
if self.data.count > 0 {
    if (language.isEmpty) {
        language = "NL"
    }
    return self.data.objectForKey("questionList" + language) as! NSArray
}

return NSArray()

}

저는 @Harris와 @Garanda 답변이 가장 좋은 접근법이라고 생각합니다.

어쨌든 귀하의 경우에는 변수가 필요하지 않으므로 다음을 수행할 수 있습니다.

public func getQuestionList(language: String) -> NSArray {
    if self.data.count > 0 {
        return self.data.objectForKey("questionList" + (language.isEmpty ? "NL" : language)) as! NSArray
    }
    return NSArray()
}

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Functions.html

In-Out 매개변수

함수 모수는 기본적으로 상수입니다.함수 매개 변수의 값을 해당 함수의 본문 내에서 변경하려고 하면 컴파일 시간 오류가 발생합니다.이는 실수로 매개 변수의 값을 변경할 수 없음을 의미합니다.함수가 매개 변수의 값을 수정하도록 하고 함수 호출이 종료된 후에도 이러한 변경 사항이 계속 유지되도록 하려면 대신 해당 매개 변수를 in-out 매개 변수로 정의합니다.

inout 키워드를 매개변수 유형 바로 앞에 배치하여 in-out 매개변수를 작성합니다.in-out 매개변수는 함수에 전달되고 함수에 의해 수정되며 원래 값을 대체하기 위해 함수에서 다시 전달되는 값을 가집니다.In-Out 매개 변수의 동작 및 관련 컴파일러 최적화에 대한 자세한 내용은 In-Out 매개 변수를 참조하십시오.

변수는 in-out 매개 변수의 인수로만 전달할 수 있습니다.상수 및 리터럴은 수정할 수 없으므로 상수 또는 리터럴 값을 인수로 전달할 수 없습니다.변수를 in-out 매개 변수에 인수로 전달할 때 변수 이름 바로 앞에 앰퍼샌드(&)를 배치하여 함수에 의해 수정될 수 있음을 나타냅니다.

메모

인아웃 매개 변수는 기본값을 가질 수 없으며, 변수 매개 변수는 인아웃으로 표시할 수 없습니다.

다음은 swapTwoInt(::)라는 함수의 예로, a와 b라는 두 개의 인아웃 정수 매개 변수가 있습니다.

func swapTwoInts(_ a: inout Int, _ b: inout Int) {
    let temporaryA = a
    a = b
    b = temporaryA
}

swapTwoInt(::) 함수는 단순히 b의 값을 a로, a의 값을 b로 스왑합니다.함수는 a의 값을 임시 A라는 임시 상수에 저장하고 b의 값을 a에 할당한 다음 임시 A를 b에 할당하여 이 스왑을 수행합니다.

두 변수 유형의 Int를 사용하여 swapTwoInt(:) 함수를 호출하여 값을 스왑할 수 있습니다.참고로 일부의 이름은Int and otherint는 swapTwoInt(::) 함수로 전달될 때 앰퍼샌드로 접두사가 붙습니다.

var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)
print("someInt is now \(someInt), and anotherInt is now \(anotherInt)")
// Prints "someInt is now 107, and anotherInt is now 3"

위의 예는 일부의 원래 값을 보여줍니다.Int and otherint는 원래 함수 외부에서 정의된 것이지만 swapTwoInt(::) 함수에 의해 수정됩니다.

메모

인아웃 매개변수는 함수에서 값을 반환하는 것과 다릅니다.위의 swapTwoInt 예제는 반환 유형을 정의하거나 값을 반환하지 않지만 일부 값은 수정합니다.Int 와 다른 Int.인아웃 매개변수는 함수가 함수 본체의 범위 밖에서 영향을 미치는 대체 방법입니다.

여기 또 다른 아이디어가 있습니다.제 사용 사례는 문자열 배열을 전달하여 추가하는 것이었는데, 이 경우 배열은 불변으로 전달되어야 합니다.저는 이것에 대해서도 우리 반에 주를 두고 싶지 않았습니다.그래서 저는 배열을 유지하고 통과시키는 클래스를 만들었습니다.사용 사례에 따라 하나의 변수만 포함하는 클래스를 갖는 것은 어리석은 것처럼 보일 수 있습니다.

private class StringBuilder {
    var buffer: [String] = []

    func append(_ str: String) {
        buffer.append(str)
    }

    func toString() -> String {
        return buffer.joined()
    }
}

사용만 합니다.append그리고.joined배열의 메소드를 사용하여 내 코드에 대한 다른 변경 사항을 최소화하면서 유형을 쉽게 변경할 수 있습니다.

사용 예:

private func writeMap(map: LevelMap, url: URL) -> Bool {
    let buffer = StringBuilder()

    if !writeHeader(map: map, buffer: buffer) {
        return false
    }
    if !writeFloors(map: map, buffer: buffer) {
        return false
    }

    let content = buffer.toString()
    do {
        try content.write(to: url, atomically: true, encoding: .utf8)
        return true
    } catch {}
    return false
}

private func writeHeader(map: LevelMap, buffer: StringBuilder) -> Bool {
    buffer.append("something here ...\n")
    return true
}

난 네가 해야 한다고 생각한다.inout대신, 이 토론에서 제시된 권장 사항을 따릅니다.

상황에 맞게 예를 들어 설명하자면,

public func getQuestionList(var language: String) 

다음으로 대체해야 합니다.

public func getQuestionList(language: inout String) 

언급URL : https://stackoverflow.com/questions/36164973/var-parameters-are-deprecated-and-will-be-removed-in-swift-3

반응형