簡體   English   中英

_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.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM