2016-07-03 5 views
-1

これを一度だけ並べ替えるだけです:Swift - 文字列:シーケンスかどうか?

In Swift。文字列データ型は、配列やタプルと同じようにシーケンスとして扱うことができますか?

func printAnySequence<T: SequenceType>(anything: T) { 
    for element in anything { 
     print("\(element),") 
    } 
} 

printAnySequence("A random string") 

上記のコードは、文字列型の引数リストを使用して「Can not invoke printAnySequence」というメッセージでコンパイラエラーを生成します。

let randomString: String = "A random string" 

for char in randomString { 
    print(char) 
} 

上記のコードは、メッセージとコンパイルエラー発生に対し:「型 『string』がプロトコルに準拠していない 『SequenceType』」

スウィフトのドキュメントが明示的に文字列が固定されているシーケンスを言うしかし、文字の

enter image description here

どこにエラーがありますか?

おかげ マックス謝

+0

答えは「いいえ」です。一連の文字が必要な場合は、 'string.characters'を使用してください。ドキュメント中の単語シーケンスは文字列の性質を記述し、 'SequenceType'型について何も言わない。また、文字列リテラルは全く異なるものです。 – Sulthan

答えて

1

いいえ、StringSequenceTypeを実装していません。ドキュメントでは文字列リテラルを "固定文字列"と呼びますが、これはSequenceTypeプロトコルとは関係ありません。しかしString.charactersは、タイプString.CharacterViewであり、であり、SequenceType(それはさらにBidirectionalCollectionTypeを実装します)です。

あなたが本当にしたい場合、あなたは非常に簡単にStringBidirectionalCollectionType(およびRangeReplaceableCollectionType)に準拠してみましょうことができます:

extension String: BidirectionalCollectionType, RangeReplaceableCollectionType { 
    // String already implements the necessary methods 
    // and properties, so we can leave this empty 
} 

ただし、これは推奨されません。中核のSwiftチームは、、CollectionTypeなどのプロトコル拡張のメソッドは、Swift文字列の性質のためにStringのために保持できなかったシーケンス/コレクションについて仮定を行うかもしれないという理由で、これらの適合性を理由なく除外しました。

関連する問題