我正在使用_ArrayType
在我的项目中,当我在 swift 2.1 上运行时。我上周升级到 swift 3.0.2 (Xcode 8.2.1),我发现here that _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 可用。
比我调查的斯威夫特 2.1 文档我可以在协议列表中看到“_ArrayType”,但在 Swift 中3.0/3.1我看不到文档_ArrayProtocol
.
以下划线开头的类型名称应始终被视为内部类型名称。
在 Swift 3.1 中,它被标记为internal
在源代码中,因此
不公开可见。
Using _ArrayProtocol
was a 解决方法在早期的 Swift 版本中,
你无法定义一个Array
具有“相同类型”要求的扩展。
从 Swift 3.1 开始,这已经成为可能,如Xcode 8.3 发行说明:
约束扩展允许通用参数和具体类型之间存在相同类型的约束。(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 字节。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)