【问题标题】:A common init function for all IntegerLiteralConvertible in SwiftSwift 中所有 IntegerLiteralConvertible 的通用初始化函数
【发布时间】:2015-07-03 16:03:23
【问题描述】:

我目前已经制作了一个包含一堆冗余初始化器的协议

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,我可以使用它来调用初始化程序,但这似乎也不起作用。

基本上有办法制作(我猜是通用的?)初始化程序,它接受任何可以转换为双精度的东西,然后执行通用初始化。

init<T : ANYTHING_THAT_CAN_BE_CONVERTED_TO_DOUBLE>(_ v : T) {
   let d : Double = Double(T)

   // Do stuff to init
}

更新

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

【问题讨论】:

    标签: swift generics protocols


    【解决方案1】:

    调用初始化器时需要使用self.init(...)(注意小写):

    extension ConvertibleUnit {
        init(_ v: Int) {
            self.init(Double(v))
        }
    
        init(_ v: Float) {
            self.init(Double(v))
        }
    }
    

    【讨论】:

      【解决方案2】:

      在协议扩展中尝试使用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(您提到过)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-19
        • 2012-03-29
        • 1970-01-01
        • 2018-02-06
        • 2020-03-05
        • 1970-01-01
        相关资源
        最近更新 更多