1

_ArrayType当我在 swift 2.1 上运行时,我在我的项目中使用。我上周升级到了 swift 3.0.2 (Xcode 8.2.1),我发现这里改成_ArrayType_ArrayProtocol并且运行良好。

今天我将我的 Xcode 升级到 8.3.1,它给了我错误: Use of undeclared type '_ArrayProtocol'. 这是我的代码:

extension _ArrayProtocol where Iterator.Element == UInt8 {
    static func stringValue(_ array: [UInt8]) -> String {
        return String(cString: array)
    }
}

现在怎么了?为什么 _ArrayProtocol 在 swift 3.1 中未声明,而它在 swift 3.0.2 中工作。

另外,当我在 git 中查看时,我看到 _ArrayProtocol 可用。比起查看Swift 2.1 文档,我能够在协议列表中看到“_ArrayType”,但在 Swift 3.0 / 3.1文档中我看不到_ArrayProtocol

4

1 回答 1

2

以下划线开头的类型名称应始终视为内部类型。在 Swift 3.1 中,它被标记为internal在源代码中,因此不公开可见。

Using_ArrayProtocol是早期 Swift 版本中的一种解决方法,您无法定义Array具有“相同类型”要求的扩展。正如Xcode 8.3 发行说明中所述,这现在可以从 Swift 3.1 开始 :

约束扩展允许泛型参数和具体类型之间的相同类型约束。(SR-1009)

因此不再需要使用内部协议,您可以简单地定义

extension Array where Element == UInt8 {

}

但请注意,您static func stringValue()不需要对元素类型进行任何限制。您可能打算定义一个这样的实例方法

extension Array where Element == UInt8 {

    func stringValue() -> String {
        return String(cString: self)
    }

}

print([65, 66, 67, 0].stringValue()) // ABC

另请注意,它String(cString:)需要一个以空字符结尾的 UTF-8 字节序列。

于 2017-04-11T07:01:55.940 回答