Xcode ';var';参数已弃用,将在Swift 3中删除
好的,我刚刚将Xcode更新为7.3,现在我得到以下警告: “var”参数已弃用,将在Swift 3中删除 当我需要在此函数中使用var时,如何解决此问题:Xcode ';var';参数已弃用,将在Swift 3中删除,xcode,swift,xcode7,swift3,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" }
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 language = language
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"
您是否尝试分配给新的变量
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()
}
很多人建议使用
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
关于从函数参数中删除Var的讨论在GitHub上的本次提交中有完整的记录: 在该文档中,您会发现人们经常混淆
var
参数和inout
参数。var
参数仅仅意味着参数在函数的上下文中是可变的,而对于inout
参数,返回点处的参数值将从函数中复制到调用方的上下文中
解决此问题的正确方法是从参数中删除
var
,并引入一个局部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()
}
var language = language
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"
private class StringBuilder {
var buffer: [String] = []
func append(_ str: String) {
buffer.append(str)
}
func toString() -> String {
return buffer.joined()
}
}
其余代码可以保持不变,如下所示:
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()
}
我认为哈里斯和加兰达的回答是最好的方法 无论如何,在您的情况下,不需要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()
}
输入输出参数
默认情况下,函数参数是常量。试图从函数体中更改函数参数的值会导致编译时错误。这意味着您不能错误地更改参数的值。如果希望函数修改参数的值,并且希望这些更改在函数调用结束后保持不变,请将该参数定义为in-out参数
通过将inout关键字放在参数的类型之前,可以编写一个in-out参数。in-out参数具有一个值,该值传入函数,由函数修改,并从函数中传回以替换原始值。有关in-out参数行为和相关编译器优化的详细讨论,请参阅in-out参数
只能将变量作为输入输出参数的参数传递。不能将常量或文字值作为参数传递,因为无法修改常量和文字。当您将变量作为参数传递给in-out参数时,可以将符号(&)直接放在变量名称之前,以指示函数可以修改该变量
注
输入输出参数不能有默认值,可变参数不能标记为输入输出
下面是一个名为swapTwoInts(::)的函数示例,该函数有两个名为a和b的in-out整数参数:
func swapTwoInts(_ a: inout Int, _ b: inout Int) {
let temporaryA = a
a = b
b = temporaryA
}
swapTwoInts(::)函数只是将b的值交换为a,将a的值交换为b。该函数通过将a的值存储在一个名为temporaryA的临时常量中,将b的值赋给a,然后将temporaryA赋给b来执行此交换
您可以使用Int类型的两个变量调用swapTwoInts(::)函数来交换它们的值。请注意,someInt和anotherInt的名称在传递给swapTwoInts(:)函数时,会以与作为前缀:
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 language = language
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"
上面的示例显示someInt和anotherInt的原始值由swapTwoInts(::)函数修改,即使它们最初是在函数外部定义的
注
In-out参数与从函数返回值不同。上面的swaptwoint示例没有定义返回类型或返回值,但它仍然修改someInt和anotherInt的值。In-out参数是函数在其函数体范围之外产生效果的另一种方法。这里是另一个想法。我的用例是传递一个字符串数组以附加到它,对于这个字符串数组必须以可变方式传递。我也不想在我的课堂上有这样的状态。所以我创建了一个类来保存数组并传递它。根据您的用例,拥有一个只包含一个变量的类似乎很愚蠢
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
}
}public func getQuestionList(inout语言:String)->NSArray怎么样No,这不是一个合适的替代品。OP可能不希望<代码> GET问题>代码有任何副作用。我真的不知道为什么他们会考虑删除这个。这是使斯威夫特令人敬畏的功能之一!从来没有使用过它自己,也不理解它的大惊小怪。@ MikeTaverne(迟回复)考虑以下功能:<代码> Func Fo({Bar:int){/*使用bar */bar=1;Foo(bar);}。如果没有var参数,这是不可能的。您需要在函数中创建一个单独的var并复制该值,或者将参数标记为inout。前者速度慢,后者导致未定义的行为。很多算法都是这样使用递归的。我认为OP想要的并不是这样。我会像@garana一样理解OP的问题。OP在他们的问题中没有使用inout,他们只是在局部变异一个预先存在的变量。实际上这是正确的解决方案。请看提出这一变化的《快速进化》杂志:@TimVermeulen每个人都想使用进步的语言。苹果可以通过多种方式开发他们的语言,而不是通过每一次修改语法