_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 字节数。
当我在 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 字节数。