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

为什么Swift BooleanLiteralConvertible需要一个布尔文字?,第1张

概述我正在尝试将BooleanLiteralConvertible支持添加到我的类中,以便我可以使用布尔值实例化它.抛弃循环的东西是布尔值和布尔文字之间的区别. 例如,添加协议后,我试图这样做: func setSelected(value: Bool) { var node: MyClass = value} 但Swift抱怨它无法将Bool转换为MyClass.我花了一段时间才意识到它必 我正在尝试将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)

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

总结

以上是内存溢出为你收集整理的为什么Swift BooleanLiteralConvertible需要一个布尔文字?全部内容,希望文章能够帮你解决为什么Swift BooleanLiteralConvertible需要一个布尔文字?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1041653.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存