2017-04-11 7 views
1

J'utilisais _ArrayType dans mon projet quand je courais sur swift 2.1. J'ai mis à jour 3.0.2 (Xcode 8.2.1) la semaine dernière et j'ai trouvé here que _ArrayType est changé en _ArrayProtocol et cela fonctionnait bien.Est-ce que _ArrayType ou _ArrayProtocol n'est pas disponible dans Swift 3.1?

Aujourd'hui j'ai mis à jour mon Xcode à 8.3.1, et il me donne l'erreur: Use of undeclared type '_ArrayProtocol'. Voici mon code:

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

Qu'est-ce qui ne va pas maintenant? Pourquoi _ArrayProtocol n'est pas déclaré dans swift 3.1 alors qu'il travaillait dans swift 3.0.2.

Aussi quand je regarde ici in git Je vois _ArrayProtocol disponible. Que j'ai regardé dans Swift 2.1 docs Je suis en mesure de voir '_ArrayType' dans la liste des protocoles, mais dans Swift 3.0/3.1 docs Je ne suis pas en mesure de voir _ArrayProtocol.

+0

En rapport http://stackoverflow.com/questions/40691327/cant-assign-the-item-in-arrayprotocol –

Répondre

2

Les noms de type commençant par un trait de soulignement doivent toujours être considérés comme internes. Dans Swift 3.1, il est marqué internal dans le code source et donc non visible publiquement.

L'utilisation _ArrayProtocol est une solution de contournement dans les versions antérieures Swift où on ne pouvait pas définir une extension Array avec une exigence de « même type ». Il est maintenant possible de Swift 3.1, comme décrit dans la Xcode 8.3 release notes:

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

En utilisant le protocole interne est donc plus nécessaire, et vous pouvez simplement définir

extension Array where Element == UInt8 { 

} 

Mais notez que votre static func stringValue() n'a pas besoin de restriction du type d'élément. Ce que vous peut-être l'intention est de définir une méthode d'instance comme ceci:

extension Array where Element == UInt8 { 

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

} 

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

Notez également que String(cString:) attend un terminateur nul séquence de UTF-8 octets.