【问题标题】:Understanding syntax for an array of tuples in Swift理解 Swift 中元组数组的语法
【发布时间】:2016-10-09 15:57:58
【问题描述】:

我正在尝试理解 Swift 中元组数组的语法:

如果我创建一个元组:

var gameScore: (points: Int, player: String)

我可以这样赋值:

gameScore = (1700, "Lisa")

并创建这个元组的数组:

var gameScores = [gameScore]

我可以这样追加到数组中:

gameScores.append((1650, "Bart"))

这样:

gameScore = (1600, "Maggie")
gameScores += [gameScore]

但不是这样:

gameScores += [(1600, "Maggie")]

游乐场错误是:

Playground 执行失败:错误:Tuples Playground.playground:38:1:错误:无法将类型“[(points:Int,player:String)]”的值转换为预期的参数类型“inout _” gameScores += [(1600, "Maggie")]

但是,这种方式有效:

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

是的——我有上面的代码可以工作,但我试图找出我在失败的语法中不理解的地方。元素不需要以.append() 方法命名,但需要以+= [()] 命名。

【问题讨论】:

标签: arrays swift syntax tuples


【解决方案1】:

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

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

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

gameScores = gameScores + [(1600, "Maggie")]

全部编译。

当涉及+= 时,Swift 似乎无法推断类型。

+=的定义:

func +=<C : Collection>(lhs: inout Array<C.Iterator.Element>, rhs: C)

说明lhsrhs的类型不同。 Swift 无法从给定的信息中协调 lhsrhs 的类型。它似乎从rhs 开始,然后得出结论,左侧的类型是inout _,它试图将其与gameScores 的类型相协调,即[(points: Int, player: String)]。它应该能够推断类型吗?也许吧,但在这种情况下,既然你有一个简单的解决方法,我说让编译器休息一下,给它显式的类型信息,让它的工作更容易:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    相关资源
    最近更新 更多