我有一组(String,Bool)
元组:
var names : [(name:String, important:Bool)] = [("Paul",true), ("Peter",false)]
我还有一个UISwitch
控件:
@IBOutlet weak var importantSwitch: UISwitch!
我想添加到数组,使用开关状态来确定Bool
。
以下不工作:
names.append( name: "whatever", important: importantSwitch.on )
XCode报告的问题是“类型T不符合协议IntegerLiteralConvertible”。
这些确实有效:
let i : Bool = importantSwitch.on
names.append( name: "whatever", important: i )
或
names.append( name: "whatever", important: importantSwitch.on==true )
我的问题,基本上是,为什么?
答案 0 :(得分:2)
一个简单而令人满意的重写就是施放:
names.append(name: "whatever", important: importantSwitch.on as Bool)
更好的是,如果您不想执行任何演员或任务舞蹈,那么请使用extend
代替append
:
names.extend([(name: "whatever", important: importantSwitch.on)])
正如Martin R所说,类型别名也解决了它,因为它允许你明确地提供一个构造函数:
typealias Pair = (name:String, important:Bool)
var names = [Pair]()
names.append(Pair(name: "whatever", important: importantSwitch.on))
我认为extend
直接工作且append
的事实并未显示问题所在:它是元组语法。这里的问题是 - 尽管这是一个鲜为人知的事实 - 函数参数列表,以及函数调用中的参数列表,本身实际上是一个元组。
因此,当您说names.append(...)
时,参数列表中的括号是 - 您是否正在尝试调用append
,就像 已命名参数name:
一样和important:
- 或者本身你要追加的元组? Swift知道这是一个元组数组并尝试解决它,但它需要一些帮助。你可能认为我们可以通过一组额外的括号解决这个问题,但没有这样的运气;我认为这是因为多个嵌套的parens没有意义(它们在解析过程的早期被抛弃到一组parens)。但是,使用extend
,我们可以在其中写入带有文字元组的文字数组,并且没有歧义。类型和构造函数同样明确无误。