我创建了一个模仿布尔值的枚举,我希望能够自动将真正的布尔值转换为此自定义类型。
由于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
}
答案 0 :(得分:2)
也许协议BooleanType
可以帮助你,试着像这样实现它:
enum CustomType :BooleanType{
var boolValue: Bool {
switch self {
case .True:
return true
case .False:
return false
}
}
case True
case False
init(bool:Bool){
self = bool ? .True : .False
}
}
然后你可以使用:
let myTrue = true
let trueType = CustomType(bool: myTrue)
if trueType {
print("hello world")
}
注意:LiteralConvertible
协议仅用于文字转换
答案 1 :(得分:1)
有些功能可以在Swift的早期版本中支持这样的功能,并且有意删除它们。 Swift通常避免隐式类型转换。它们往往会爆炸编译时间,并且经常导致意外和不期望的转换。当前从T
到T?
的隐式转换是混淆编译器错误和通用代码中不正确的重载调用的常见原因。在没有对Swift编译器进行更多更改的情况下构建更多类似的东西是有问题的。即使是隐含的数字转换,Swift团队原则上表示这是理想的,但由于这些问题而且您需要明确转换,因此目前无法实现。
首选方法是在有用的情况下定义显式重载:
func def(a: Bool) { def(CustomType(a)) }
答案 2 :(得分:0)
你可以尝试定义一个struct
而不是enum
,并使用一些静态常量来使它们工作"喜欢"枚举
struct CustomType : BooleanType {
private let bValue : Bool
var boolValue: Bool { return bValue }
init(bool: Bool) {
self.bValue = bool
}
}
extension CustomType {
static let False = CustomType(bool: false)
static let True = CustomType(bool: true)
}
extension CustomType : BooleanLiteralConvertible {
init(booleanLiteral value: BooleanLiteralType) {
self = CustomType(bool: value)
}
}
你可以通过
来使用它们let myType : CustomType = .False
作为枚举(即使它们绝对不一样)