'var'参数已弃用,将在Swift 3中删除

SDW*_*SDW 116 xcode swift xcode7 swift3

好吧所以我只是将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()
}
Run Code Online (Sandbox Code Playgroud)

Tr0*_*0yJ 98

关于从函数参数中删除Var的讨论已完全记录在GitHub上的这个提交中:删除Var参数

在该文档中,您会发现人们经常将var参数与inout参数混淆.甲var参数仅仅意味着所述参数是所述函数的范围内可变的,同时用inout参数在返回点的参数值将被复制出功能并进入调用者的上下文.

解决此问题的正确方法是var从参数中删除并引入局部var变量.在例程的顶部将参数的值复制到该变量中.

  • 我根本不理解这种变化,为什么不得不编写另一行来创建一个可变的局部var比仅仅将param定义为var更好? (43认同)
  • 我和@RossBarbish 在一起。所以......这被删除是因为懒惰的开发人员无法区分 inout 和 var 参数?噗... (3认同)
  • 这似乎非常没有必要......,他们应该保留这两个选项。 (2认同)

gar*_*nda 81

您是否尝试过分配新的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()
}
Run Code Online (Sandbox Code Playgroud)

  • 使用var language = language,如果你不想引入另一个变量名(这是第一个imo中var参数的主要优点) (24认同)
  • 不是我认为OP想要的 (11认同)
  • 实际上这是正确的解决方案.请参阅提出此更改的Swift evolution问题:https://github.com/apple/swift-evolution/blob/master/proposals/0003-remove-var-parameters.md (10认同)
  • @TimVermeulen每个人都想使用渐进式语言.Apple可以通过多种方式开发语言,而不是每个月更改语法.如您所知,由于Apple,大量的在线文档和代码片段已经过期或过时.开发人员必须来到这个网站,因为它而反复寻求许多愚蠢问题的帮助.如果Apple希望更多开发人员擅长语法,那么语法必须从一开始就是可靠的. (8认同)
  • 我会像@garana一样理解OP的问题.OP在他们的问题中没有使用inout,他们只是在本地*变异预先存在的变量*. (6认同)
  • @TomSawyer你知道你在Swift中遇到了什么.如果您不想使用不断发展的语言,请使用Objective-C. (2认同)

Har*_*ris 61

只需在函数开头添加这一行:

var language = language
Run Code Online (Sandbox Code Playgroud)

并且其余代码可以保持不变,如下所示:

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()
}
Run Code Online (Sandbox Code Playgroud)

  • 到目前为止最好的答案.只需要换一行. (5认同)

Tim*_*len 13

很多人都在建议一个inout参数,但这并不是他们的设计目标.此外,它不允许使用let常量调用函数,也不允许使用字符串文字调用函数.为什么不简单地将默认值添加到函数签名中?

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

getQuestionList如果您想要默认语言,请确保不使用空字符串调用,但只需省略参数:

let list = getQuestionList() // uses the default "NL" language
Run Code Online (Sandbox Code Playgroud)

  • 我也不明白为什么当OP在开始时甚至没有使用它时,每个人都跳出了inout解决方案...... (3认同)