我目前制作了一个包含多个冗余初始化程序的协议
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
,我可以用它来调用初始化程序,但这似乎也不起作用。
基本上有一种方法可以制作(我猜一个通用?)初始值设定项,它接受任何可以转换为double的东西,然后执行泛型初始化。
init<T : ANYTHING_THAT_CAN_BE_CONVERTED_TO_DOUBLE>(_ v : T) {
let d : Double = Double(T)
// Do stuff to init
}
答案 0 :(得分:1)
调用初始化程序时,您需要使用self.init(...)
(注意小写):
extension ConvertibleUnit {
init(_ v: Int) {
self.init(Double(v))
}
init(_ v: Float) {
self.init(Double(v))
}
}
答案 1 :(得分:0)
在协议扩展程序中尝试使用Self.init(Double(v))
。这将允许您使用单个初始值设定项,但从所有符合的类型中获取多个。有关使用协议和扩展的更多信息,请阅读我的博文:http://manavgabhawala.me/#/blog/protocol-oriented-programming
此外,如果您想使用泛型,可以使用两种协议:FloatLiteralConvertible
和FloatingPointType
。您可以在此处找到标准库中的所有协议:https://developer.apple.com/library/prerelease/ios/documentation/General/Reference/SwiftStandardLibraryReference/#protocols
您还可以使用IntegerType
和IntegerLiteralConvertible
(您提到过)。