ios - 来自 UI 控件的奇怪 Bool 类型

标签 ios swift types uikit

我有一个 (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 不符合协议(protocol) 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))

我认为 extend 直接工作而 append 并没有说明问题所在:这是元组语法。这里的问题是 - 尽管这是一个鲜为人知的事实 - 函数参数列表,以及函数调用中的参数列表,本身实际上是一个元组。

因此,当您说 names.append(...) 时,括号中的内容就是参数列表 - 您是否正在尝试调用 append 就好像 已命名参数 name:important: - 还是它本身 是您要附加的元组? Swift 知道这是一个元组数组并尝试计算它,但它需要一些帮助。你可能认为我们可以用一组额外的括号来解决这个问题,但没有这样的运气;我认为这是因为多个嵌套的括号是没有意义的(它们在解析过程的早期被丢弃到一组括号中)。但是,使用 extend,我们可以编写其中包含文字元组的文字数组,并且没有歧义。类型别名和构造函数同样明确。

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

相关文章:

ios - 没有确认提示的自定义 URL 方案 (Swift)

ios - SwiftUI,从 subview 中关闭模态/页面

swift - TextField 中的占位符文本颜色

delphi - 如何创建一个字符串类型?

c - 指针赋值错误 C

ios - xcode快捷键导入h文件并添加Delegate方法

ios - 黄金比例角圆角框矩形按钮

iOS - Firebase 返回 null 但存在数据字段

ios - 如何设置UITableViewCell的imageView?

java - 仍然不确定为什么这个整数保持不变