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

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" }

好的,我刚刚将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()
}
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每个人都想使用进步的语言。苹果可以通过多种方式开发他们的语言,而不是通过每一次修改语法