Swift - 是否有布尔可转换协议或任何其他方式将转换重载到自定义类型?

Bap*_*hot 5 casting ios swift

我创建了一个模仿布尔值的枚举,我希望能够自动将真正的布尔值转换为这个自定义类型。

由于 BooleanLiteralConvertible 协议(见下文),可以为文字布尔值做到这一点。

是否有非文字布尔值的等效协议?或者有没有办法重载as?操作员 ?

enum CustomType {
    case True
    case False
}
extension CustomType : BooleanLiteralConvertible {
    init(booleanLiteral value: BooleanLiteralType) {
        if value {
            self = .True
        } else {
            self = .False
        }
    }
}
func def(a: CustomType) {

}

func test() {
    let a : Bool = true
    def(true) // compiles
    def(a) // does not compile
}
Run Code Online (Sandbox Code Playgroud)

Rob*_*ier 1

Swift 的早期版本中有支持此类功能的功能,但它们被有意删除。Swift 通常会避免隐式类型转换。它们往往会增加编译时间,并经常导致意外和不需要的转换。T当前从到的隐式转换T?是泛型代码中令人困惑的编译器错误和不正确的重载调用的常见来源。在不对 Swift 编译器进行更多更改的情况下构建更多类似的东西是有问题的。由于这些问题,即使是 Swift 团队表示原则上需要的隐式数字转换目前也是不可能的,您需要显式转换。

首选方法是在有用的情况下定义显式重载:

func def(a: Bool) { def(CustomType(a)) }
Run Code Online (Sandbox Code Playgroud)