Swift中所有IntegerLiteralConvertible的公共init函数

时间:2015-07-03 16:03:23

标签: swift generics protocols

我目前制作了一个包含多个冗余初始化程序的协议

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}
}

基本上我希望制作协议扩展并定义FloatInt的默认版本

我尝试了一些类似于:

的选项(两者都有错误)
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
}

更新

  • 尝试使用Self.init(Double(v))

enter image description here

2 个答案:

答案 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

此外,如果您想使用泛型,可以使用两种协议:FloatLiteralConvertibleFloatingPointType。您可以在此处找到标准库中的所有协议:https://developer.apple.com/library/prerelease/ios/documentation/General/Reference/SwiftStandardLibraryReference/#protocols

您还可以使用IntegerTypeIntegerLiteralConvertible(您提到过)。