2017-04-11 4 views
1

私はswift 2.1で動いていたときに私のプロジェクトで_ArrayTypeを使っていました。私は先週3.0.2(Xcode 8.2.1)へのアップグレードを行いました。here_ArrayType_ArrayProtocolに変更され、うまくいきました。_ArrayTypeまたは_ArrayProtocolはSwift 3.1では使用できませんか?

今日私は自分の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は、スイフト3.0.1で宣言されていないのはなぜですか?

また、私がここで見ると、in gitは_ArrayProtocolが利用可能です。 私が調べたよりSwift 2.1 docsプロトコルリストに「_ArrayType」が表示されていますが、Swiftには3.0/3.1というドキュメントがあります。_ArrayProtocolは表示されません。

+0

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

答えて

2

アンダースコアで始まるタイプ名は、常に内部として扱う必要があります。 Swift 3.1では、ソースコードにinternalとマークされているため、公開されていないのは です。 _ArrayProtocolを使用して

は、あなたが「同じタイプ」要件にArray拡張子を定義することができませんでした 以前スウィフトのバージョンで回避策ました。 、内部プロトコルはもう必要がない を使用して

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

、あなたは単に

extension Array where Element == UInt8 { 

} 

を定義しかし、ことに注意することができます Xcode 8.3 release notesで説明したように これは、スウィフト3.1のようことが可能になりました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バイトの を期待していることに注意してください。

関連する問題