理解Swift中元组数组的语法

Gal*_*her 5 arrays syntax tuples swift

我试图理解Swift中元组数组的语法:

如果我创建一个元组:

var gameScore: (points: Int, player: String)
Run Code Online (Sandbox Code Playgroud)

我可以分配这样的值:

gameScore = (1700, "Lisa")
Run Code Online (Sandbox Code Playgroud)

并创建一个这个元组的数组:

var gameScores = [gameScore]
Run Code Online (Sandbox Code Playgroud)

我可以这样追加到数组:

gameScores.append((1650, "Bart"))
Run Code Online (Sandbox Code Playgroud)

这样:

gameScore = (1600, "Maggie")
gameScores += [gameScore]
Run Code Online (Sandbox Code Playgroud)

但不是这样的:

gameScores += [(1600, "Maggie")]
Run Code Online (Sandbox Code Playgroud)

游乐场错误是:

游乐场执行失败:错误:元组Playground.playground:38:1:错误:无法将类型'[(points:Int,player:String)]'的值转换为预期的参数类型'inout _'gameScores + = [(1600, "劣质煤")]

但是,这种方式有效:

gameScores += [(points: 1600, player: "Maggie")]
Run Code Online (Sandbox Code Playgroud)

是的 - 我上面的代码可以使用,但是我想弄清楚我在错误的语法中没有理解的东西.元素不需要为.append()方法命名,但需要为它们命名+= [()].

vac*_*ama 3

Swift 类型推理系统已经被拉伸到了崩溃的地步。Swift 无法推断[(1600, "Maggie")]示例中的类型。如果您提供更多信息,您的示例将编译:

gameScores += [(1600, "Maggie") as (points: Int, player: String)]

gameScores += [(1600, "Maggie")] as [(points: Int, player: String)]
Run Code Online (Sandbox Code Playgroud)

gameScores = gameScores + [(1600, "Maggie")]
Run Code Online (Sandbox Code Playgroud)

全部编译。

看来 Swift 在+=推断类型时遇到了困难。

查看 的定义+=

func +=<C : Collection>(lhs: inout Array<C.Iterator.Element>, rhs: C)
Run Code Online (Sandbox Code Playgroud)

lhs表明和的类型rhs不同。Swift 无法根据给定的信息协调 thelhs和 the的类型。rhs它似乎从 开始,rhs然后得出结论,左侧的类型是 ,并且它尝试将其与的inout _类型相协调。它应该能够推断类型吗?也许吧,但在这种情况下,由于您有一个简单的解决方法,我建议让编译器休息一下并为其提供显式类型信息并使其工作更轻松:gameScores[(points: Int, player: String)]

gameScores += [(points: 1600, player: "Maggie")]
Run Code Online (Sandbox Code Playgroud)