'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() }
在GitHub上提交的有关从函数参数中删除Var的讨论完整logging: 删除Var参数
在那个文档中,你会发现人们经常会把var
参数和inout
参数混淆起来。 var
参数仅仅意味着参数在函数的上下文中是可变的,而使用inout
参数时,返回点处的参数值将被复制到函数的外部和调用者的上下文中。
解决这个问题的正确方法是从参数中删除var
,并引入一个局部variablesvar
。 例程的顶部将参数的值复制到该variables中。
在函数的开头添加这一行:
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
参数,但这不是他们devise的。 另外,它不允许使用let
常量来调用函数,也不允许使用string文字。 为什么不简单地将默认值添加到函数签名?
public func getQuestionList(language language: String = "NL") -> NSArray { if data.count > 0 { return data.objectForKey("questionList" + language) as! NSArray } else { return NSArray() } }
只要确保不要用空string调用getQuestionList
,以防止使用默认语言,只是省略参数:
let list = getQuestionList() // uses the default "NL" language
我认为@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() }
input输出参数
函数参数默认是常量。 试图从该函数体内更改函数参数的值会导致编译时错误。 这意味着你不能错误地改变参数的值。 如果你想要一个函数来修改一个参数的值,并且你希望这些修改在函数调用结束之后保持不变,那么定义这个参数是一个input参数。
通过将inout关键字放置在参数的types之前,可以编写一个in-out参数。 input输出参数具有一个传递给函数的值,由函数修改并从函数传回以replace原始值。 有关input输出参数和相关编译器优化的详细讨论,请参阅input输出参数。
你只能通过一个variables作为input参数的参数。 您不能传递一个常量或文字值作为参数,因为常量和文字不能被修改。 当您将一个&符号(&)直接作为参数传入一个input输出参数时,它将直接放在一个variables的名称之前,以表明它可以被该函数修改。
注意
进出参数不能有默认值,可变参数不能标记为inout。
下面是一个名为swapTwoInts( : :)的函数的例子,它有两个input的整型参数,分别称为a和b:
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来执行此交换。
您可以使用两个Inttypes的variables调用swapTwoInts( : :)函数来交换它们的值。 请注意,someInt和anotherInt的名称在传递给swapTwoInts( : :)函数时,会以“&”符号作为前缀:
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( : :)函数修改的,尽pipe它们最初是在函数之外定义的。
注意
input输出参数与从函数返回值不同。 上面的swapTwoInts示例没有定义返回types或返回值,但它仍然修改someInt和anotherInt的值。 input输出参数是函数在其函数体范围之外产生效果的替代方法。
这是另一个想法。 我的用例是传递一个string数组来追加它,为此数组必须可变地传递。 我也不想在我的课上有这样的状态。 所以我做了一个拥有这个数组并通过它的类。 根据您的使用情况,拥有只包含一个variables的类似乎很愚蠢。
private class StringBuilder { var buffer: [String] = [] func append(_ str: String) { buffer.append(str) } func toString() -> String { return buffer.joined() } }
我只在数组中使用append
和joined
方法,所以很容易通过对代码的其他更改来改变types。
一些示例用法:
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 }