_ArrayType 或 _ArrayProtocol 在 Swift 3.1 中不可用吗?

Does _ArrayType or _ArrayProtocol not available in Swift 3.1?

当我在 swift 2.1 上 运行 时,我在我的项目中使用 _ArrayType。我上周升级到 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.

中工作

另外,当我看这里时 in git 我看到 _ArrayProtocol 可用。 比我查看 Swift 2.1 docs I am able to see '_ArrayType' in protocol listing but in Swift 3.0/3.1 文档我看不到 _ArrayProtocol.

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

使用 _ArrayProtocol 是早期 Swift 版本中的 解决方法 ,其中 您无法定义具有 "same type" 要求的 Array 扩展。 从 Swift 3.1 开始,这现在是可能的,如 Xcode 8.3 release notes:

Constrained extensions allow same-type constraints between generic parameters and concrete types. (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:) 需要一个 null-terminated 序列 UTF-8 字节数。