ios – 来自UI控件的Strange Bool类型

我有一个(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 )

我的问题基本上是,为什么?

最佳答案 一个简单而令人满意的重写是:

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))

我认为扩展直接工作并附加的事实并没有表明问题是什么:它是元组语法.这里的问题是 – 虽然这是一个鲜为人知的事实 – 函数参数列表,因此函数调用中的参数列表本身实际上是一个元组.

因此,当你说names.append(…)时,参数列表是括号中的东西 – 你是否试图调用append,好像它已经命名参数name:and important: – 或者它本身就是你想要的元组附加? Swift知道这是一个元组数组并尝试解决它,但它需要一些帮助.你可能认为我们可以通过一组额外的括号解决这个问题,但没有这样的运气;我认为这是因为多个嵌套的parens没有意义(它们在解析过程的早期被抛弃到一组parens).但是,使用extend,我们可以在其中写入带有文字元组的文字数组,并且没有歧义.类型和构造函数同样是明确的.

点赞