为什么Swift BooleanLiteralConvertible需要一个布尔文字?

我正在尝试将BooleanLiteralConvertible支持添加到我的类中,以便我可以使用布尔值实例化它.抛弃循环的东西是布尔值和布尔文字之间的区别.

例如,添加协议后,我试图这样做:

func setSelected(value: Bool) {
    var node: MyClass = value
}

但Swift抱怨它无法将Bool转换为MyClass.我花了一段时间才意识到它必须是一个布尔文字.奇怪的是,以下工作正常:

func setSelected(value: Bool) {
    var node: MyClass = value ? true : false
}

……这对我来说似乎太傻了.这个看似非常离奇的要求是否有正当理由?

我喜欢这个问题.只有Swift团队可以肯定地回答,但我可以推测为什么:将类型值转换为不同类型的变量而不进行显式转换或转换很容易与程序员错误混淆,并且在很多情况下是编译器应警告.

示例(并假设Person也是一个StringLiteralConvertible,可以使用字符串变量以及您在问题中提出的文字来初始化):

struct Person {

    private static var idCounter = 1

    var name:String
    let id:Int

    init(withName name:String) {
        Person.idCounter += 1
        self.name = name
        self.id = Person.idCounter
    }
}

var person = Person(withName:"Mary")
let name = "John"
person = name

上面的代码看起来很像一个错误,程序员将错误类型(String)的值赋给Person类型的变量.事实上这可能是一个错误.也许程序员只是想更改人名(person.name = name)而不创建具有新唯一ID的新Person.或者也许程序员打算给人分配一些其他值但是输入错字或代码完成错误.没有成为原始程序员,或仔细研究所有上下文,看看这种转换是否有意义,很难说.并且从最初初始化变量的位置进一步分配变得越来越难以编译器在此警告类型为String的值是否被赋值给Person类型的变量?

这个例子会更加清晰,更符合Swift惯例:

var person = Person(withName:"Mary")
let name = "John"
person = Person(withName:name)

上述版本对于编译器和后来阅读本文的任何其他程序员来说都是完全明确的.

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...