Swift 中所有 IntegerLiteralConvertible 的通用初始化函数
A common init function for all IntegerLiteralConvertible in Swift
我目前制定了一个协议,其中包含一堆冗余初始化程序
public protocol ConvertibleUnit {
///The raw value in `self` unit type
var value : Double { get set }
///The value in base units (i.e. for distance this would be `Meters`
var valueInBaseUnits : Double { get set }
///Do not interact with this directly
var data : UnitValueData { get set}
init(_ v : Double)
init(_ v : Float)
init(_ v : Int)
var unitType : ConversionEnum {get}
}
基本上我希望做一个协议扩展并定义Float
和Int
的默认版本
我尝试了一些类似于以下的选项(都出错):
extension ConvertibleUnit {
init(_ v : Float) {
init(Double(v) )
}
init(_ v : Int) {
Self(Double(v))
}
}
这让我想知道是否有一个通用协议,例如 IntegerLiteralConvertible
,我可以用它来调用初始化程序,但它似乎也不起作用。
基本上有没有办法制作(我猜是通用的?)接受任何可以转换为双精度值的初始化程序,然后执行通用初始化。
init<T : ANYTHING_THAT_CAN_BE_CONVERTED_TO_DOUBLE>(_ v : T) {
let d : Double = Double(T)
// Do stuff to init
}
更新
- 尝试使用 Self.init(Double(v))
在协议扩展中尝试使用 Self.init(Double(v))
。这将允许您使用单个初始化器,但从所有符合类型中获取多个。有关使用协议和扩展的更多信息,请阅读我的博客 post:http://manavgabhawala.me/#/blog/protocol-oriented-programming
此外,如果您想使用泛型,可以使用两种协议:FloatLiteralConvertible
和 FloatingPointType
。您可以在此处找到标准库中的所有协议:https://developer.apple.com/library/prerelease/ios/documentation/General/Reference/SwiftStandardLibraryReference/#protocols
您还可以使用 IntegerType
和 IntegerLiteralConvertible
(您提到的)。
调用初始化器时需要使用self.init(...)
(注意小写):
extension ConvertibleUnit {
init(_ v: Int) {
self.init(Double(v))
}
init(_ v: Float) {
self.init(Double(v))
}
}
我目前制定了一个协议,其中包含一堆冗余初始化程序
public protocol ConvertibleUnit {
///The raw value in `self` unit type
var value : Double { get set }
///The value in base units (i.e. for distance this would be `Meters`
var valueInBaseUnits : Double { get set }
///Do not interact with this directly
var data : UnitValueData { get set}
init(_ v : Double)
init(_ v : Float)
init(_ v : Int)
var unitType : ConversionEnum {get}
}
基本上我希望做一个协议扩展并定义Float
和Int
我尝试了一些类似于以下的选项(都出错):
extension ConvertibleUnit {
init(_ v : Float) {
init(Double(v) )
}
init(_ v : Int) {
Self(Double(v))
}
}
这让我想知道是否有一个通用协议,例如 IntegerLiteralConvertible
,我可以用它来调用初始化程序,但它似乎也不起作用。
基本上有没有办法制作(我猜是通用的?)接受任何可以转换为双精度值的初始化程序,然后执行通用初始化。
init<T : ANYTHING_THAT_CAN_BE_CONVERTED_TO_DOUBLE>(_ v : T) {
let d : Double = Double(T)
// Do stuff to init
}
更新
- 尝试使用 Self.init(Double(v))
在协议扩展中尝试使用 Self.init(Double(v))
。这将允许您使用单个初始化器,但从所有符合类型中获取多个。有关使用协议和扩展的更多信息,请阅读我的博客 post:http://manavgabhawala.me/#/blog/protocol-oriented-programming
此外,如果您想使用泛型,可以使用两种协议:FloatLiteralConvertible
和 FloatingPointType
。您可以在此处找到标准库中的所有协议:https://developer.apple.com/library/prerelease/ios/documentation/General/Reference/SwiftStandardLibraryReference/#protocols
您还可以使用 IntegerType
和 IntegerLiteralConvertible
(您提到的)。
调用初始化器时需要使用self.init(...)
(注意小写):
extension ConvertibleUnit {
init(_ v: Int) {
self.init(Double(v))
}
init(_ v: Float) {
self.init(Double(v))
}
}