3

I'm playing with Swift on Xcode6 Beta, and when I'm using in a func definition '#', just like in apple's Swift programing guide, i'm getting the following compiler error:

Extraneous '#' in parameter: 'characterToFind' is already the keyword argument name

// this code is a copy-paste code from apple's Swift language programing guide

func containsCharacter(#string: String, #characterToFind: Character) -> Bool {
    for character in string {
        if character == characterToFind {
            return true
        }
    }
    return false
}

Is it just a bug with the new Xcode?

4

1 に答える 1

13

それがメソッド(funcクラス内)の場合、#冗長であり、これがコンパイラの意味だと思います。

メソッドでは、最初の引数名はローカルのみであると見なされますが、他の引数は、#それらの前に を記述したかのように、自動的に外部名とローカル名の両方であると見なされます。

だから、代わりに

func containsCharacter(#string: String, #characterToFind: Character) -> Bool

あなたは書ける

func containsCharacter(#string: String, characterToFind: Character) -> Bool

そして、それはまったく同じことになります。

この点をさらに証明するために、遊び場でこれを試しました

func foo(#x: Int, #y: Int) { }
class foobar {
    func foo(#x: Int, #y: Int)
    func bar(#x: Int, y: Int)
}

3 つの関数は同じですが、コンパイラは 2 番目の関数で警告を出します。foo

パラメーターの不要な '#': 'characterToFind' は既にキーワード引数名​​です

繰り返しますが、最初の inメソッドの後のパラメーターは、既に自動的に外部名と見なされます。

于 2014-06-04T20:38:04.903 に答える