在swift中为特定类型的Array添加自定义init方法

时间:2016-07-04 21:24:24

标签: swift generics initialization

我想使用扩展程序在swift中向init类添加自定义Array方法,但关键是我只想将其添加到数组中bytes(UInt8

我现在有这样的事情:

public class MyData {
}

public func toByteArray(myData: MyData) -> [UInt8]? { // a global function
    // code to check if myData is valid, and extract byte array
}

似乎更多" swifty"要做的是使用一个可用的初始化程序,所以我想像这样写

extension Array where Element : UInt8 {
    init?(myData: MyData) {
        // code to check if myData is valid, and extract byte array
    }
}

此代码无法编译,我得到Type 'Element' constrained to a non-protocol type 'UInt8'

我发现other things您没有扩展数组,而是扩展_ArrayType,但这似乎并不适用于初始化程序

1 个答案:

答案 0 :(得分:0)

实现这一目标的唯一方法是Swift 2.2是制作一个UInt8符合的协议,并将其作为约束用于Array扩展。

protocol UInt8Protocol {}
extension UInt8 : UInt8Protocol {}

extension Array where Element : UInt8Protocol {

    init?(myData: MyData) {
        ...
    }
}

在Swift进化列表中提到,这个(使用相同类型约束的约束扩展)是一个高度请求的特性。它可能是Swift的下一个版本之一。