2017-04-11 4 views
1

Ich habe in meinem Projekt _ArrayType verwendet, als ich auf swift 2.1 lief. Ich habe letzte Woche auf swift 3.0.2 (Xcode 8.2.1) aktualisiert und ich habe here gefunden, dass _ArrayType in _ArrayProtocol geändert wurde und es gut funktioniert hat.Ist _ArrayType oder _ArrayProtocol in Swift 3.1 nicht verfügbar?

Heute habe ich meinen Xcode auf 8.3.1 aktualisiert, und es gibt mir einen Fehler: Use of undeclared type '_ArrayProtocol'. Hier ist mein Code:

extension _ArrayProtocol where Iterator.Element == UInt8 { 
    static func stringValue(_ array: [UInt8]) -> String { 
     return String(cString: array) 
    } 
} 

Was ist jetzt los? Warum ist _ArrayProtocol in swift 3.1 nicht deklariert, während es in swift 3.0.2 gearbeitet hat?

Auch wenn ich hier in git schaue, sehe ich _ArrayProtocol zur Verfügung. Als ich in Swift 2.1 docs schaute, kann ich '_ArrayType' in der Protokollauflistung sehen, aber in Swift 3.0/3.1 docs kann ich _ArrayProtocol nicht sehen.

+0

Verwandte http://StackOverflow.com/Questions/40691327/cant-assign-the-item-in-arrayProtocol –

Antwort

2

Typennamen, die mit einem Unterstrich beginnen, sollten immer als intern behandelt werden. In Swift 3.1 ist es im Quellcode als internal markiert und daher nicht öffentlich sichtbar.

_ArrayProtocol Verwendung war eine Abhilfe in früheren Versionen Swift wo Sie keine Array Erweiterung mit einer „gleichem Typ“ Anforderung definieren könnten. Dies ist nun möglich, als von Swift 3.1, wie in den Xcode 8.3 release notes beschrieben:

Constrained extensions allow same-type constraints between generic parameters and concrete types. (SR-1009)

das interne Protokoll zu verwenden ist notwendig, damit nicht mehr, und Sie können einfach

extension Array where Element == UInt8 { 

} 

definieren Aber beachten Sie, dass Ihr static func stringValue() benötigt keine Beschränkung des Elementtyps. Was Sie vielleicht zu beabsichtigt ist definieren eine Instanzmethode wie folgt aus:

extension Array where Element == UInt8 { 

    func stringValue() -> String { 
     return String(cString: self) 
    } 

} 

print([65, 66, 67, 0].stringValue()) // ABC 

Beachten Sie auch, dass String(cString:) ein erwartet nullterminierte Sequenz von UTF-8-Byte.

Verwandte Themen