I was using _ArrayType
in my project when I was running on swift 2.1. I upgraded to swift 3.0.2 (Xcode 8.2.1) last week and I found here that _ArrayType
is changed to _ArrayProtocol
and it was working well.
Today I upgraded my Xcode to 8.3.1, and it gives me error:
Use of undeclared type '_ArrayProtocol'
. Here is my code:
extension _ArrayProtocol where Iterator.Element == UInt8 {
static func stringValue(_ array: [UInt8]) -> String {
return String(cString: array)
}
}
What's wrong now? Why _ArrayProtocol is undeclared in swift 3.1 while it was working in swift 3.0.2.
Also when I look here in git I see _ArrayProtocol available.
Than I looked into Swift 2.1 docs I am able to see '_ArrayType' in protocol listing but in Swift 3.0/3.1 docs I am not able to see _ArrayProtocol
.
Type names starting with an underscore should always treated as internal. In Swift 3.1, it is marked as
internal
in the source code and therefore not publicly visible.Using
_ArrayProtocol
was a workaround in earlier Swift versions where you could not define anArray
extension with a "same type" requirement. This is now possible as of Swift 3.1, as described in the Xcode 8.3 release notes:Using the internal protocol is therefore not necessary anymore, and you can simply define
But note that your
static func stringValue()
does not need any restriction of the element type. What you perhaps intended is to define an instance method like this:Also note that
String(cString:)
expects a null-terminated sequence of UTF-8 bytes.