2016-12-15 73 views
1

如果我有一个结构体,我可以实现ExpressibleByIntegerLiteral以从整数文字中隐式创建它的实例。隐式强制转换为原语

struct MyStruct: ExpressibleByIntegerLiteral { 
    let value: Int 

    init(integerLiteral value: Int) { 
     self.value = value 
    } 
} 


let a: MyStruct = 1 

尼斯。

有没有办法做相反的事,即从MyStruct隐含转换为Int

我知道,我可以实现在Int扩展的init方法来获得明确的铸造工作,像这样:

extension Int { 
    init(_ myStruct: MyStruct) { 
     self = myStruct.value 
    } 
} 


let b = Int(a) 

但有什么我可以做的就是这一行编译:

let c: Int = a 
+0

见http://stackoverflow.com/questions/24645798 /不,迅速支持隐式转换 – courteouselk

回答

1

做,在一个行,最好的办法是选择价值属性:

let c: Int = a.value 

因为你不能重载“=”你可以检查出:

struct MyStruct: ExpressibleByIntegerLiteral { 
    let value: Int 

    init(integerLiteral value: Int) { 
     self.value = value 
    } 
} 


func += (inout left: Int, right: MyStruct) { 
    left = right.value 
} 


let a: MyStruct = 1; 
var c:Int = 0; 
c += a 

否则,您必须创建自定义ExpressibleBy 结构文字