我有一组 (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 协议(protocol)”。

这些确实有效:
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)

更好的是,如果您不想执行任何 Actor 或分配舞蹈,那么使用 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 知道这是一个元组数组并试图解决它,但它需要一些帮助。你可能认为我们可以用一组额外的括号来解决这个问题,但没有这样的运气;我认为这是因为多个嵌套的括号是没有意义的(它们在解析过程的早期就被抛弃为一组括号)。然而,使用 extend ,我们可以编写包含文字元组的文字数组,并且没有歧义。类型别名和构造函数同样是明确的。

关于ios - 来自 UI 控件的奇怪 Bool 类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27881460/

10-11 22:19
查看更多