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

좋아, Xcode를 7.3으로 업데이트하고 이제 다음 경고가 표시됩니다.

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

이 함수에서 var를 사용해야 할 때이 문제를 해결하는 방법 :

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()
}



답변

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

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를 제거하는 방법에 대한 논의는 GitHub : Remove Var Parameters 의이 제출에 완전히 문서화되어 있습니다.

이 문서에서 사람들은 종종 var매개 변수와 inout매개 변수를 혼동 합니다. var파라미터는 단순히 함께하면서 파라미터 함수의 문맥 내에서 변경할 수 있음을 의미 inout파라미터 반환 지점에서 파라미터의 값은 함수 및 발신자의 상황에 내보내는 것이다.

이 문제를 해결하는 올바른 방법 var은 매개 변수에서 제거 하고 지역 var변수를 도입하는 것 입니다. 루틴의 맨 위에서 매개 변수 값을 해당 변수에 복사하십시오.


답변

함수 시작 부분에 다음 한 줄을 추가하면됩니다.

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


답변

스위프트 4

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()
}

getQuestionList(language: &someString)

어떤 경우에는 (배열과 관련된 더 복잡한 설정으로) 경험했듯이 메서드 내에서 새 속성을 만들고 해당 속성을 변경하는 것이 항상 작동하지 않을 수 있습니다. 말할 것도없이, inout매개 변수와 &인수 에 단순히 추가 하는 대신 메서드를 복잡하게 만드는데, 이것이이 구문이 만들어진 이유입니다.


답변

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 답변이 최선의 접근 방식이라고 생각합니다.

어쨌든 귀하의 경우에는 var가 필요하지 않습니다.

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