[英]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.0.2中工作時未在swift 3.1中聲明。
另外,當我在git中查看時,我看到_ArrayProtocol可用。 比起Swift 2.1文檔,我能在協議列表中看到'_ArrayType',但是在Swift 3.0 / 3.1文檔中,我看不到_ArrayProtocol
。
以下划線開頭的類型名稱應始終視為內部名稱。 在Swift 3.1中,它在源代碼中被標記為internal
,因此不公開可見。
在早期的Swift版本中,使用_ArrayProtocol
是一種解決方法,在該版本中,您無法定義具有“相同類型”要求的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字節序列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.