2016-10-04 4 views
2
var str = "Hello" 

print(str.characters) // CharacterView(_core: Swift._StringCore(_baseAddress: Optional(0x000000011c9a68a0), _countAndFlags: 5, _owner: nil)) 

print(str.characters.index(of: "o")!) // Index(_base: Swift.String.UnicodeScalarView.Index(_position: 4), _countUTF16: 1) 
print(Array(str.characters)) // ["H", "e", "l", "l", "o"] 
print(str.characters.map{String($0)}) //["H", "e", "l", "l", "o"] 

for character in str.characters{ 
    print(character) 
} 
// H 
// e 
// l 
// l 
// o 

私はthis質問を読む。 SwiftのリファレンスからStringを調べたところ、var characters: String.CharacterViewが見つかりました。Stringメンバー 'characters'は何を返すのですか?

str.charactersは何を返すのですか?それは私がそう簡単にを列挙、または変換それが配列またはマップにそれをしかし、その後、それ自体、それを印刷したり、それにインデックスを付けても、することは、私はかなりだそうちんぷんかんぷん

を出力できることですどのように私が理解していないことは、理解していないためです。characterView。私は、誰かがそれが何をしているのか、そしてこの質問でここで何を意味するのかを概説することができれば嬉しいです。

+1

'CharacterView'のドキュメントだけでなく、それに準拠したプロトコルのドキュメントでも、あなたが探しているものです。例えば ​​'Sequence'プロトコルに準拠しているので、' CharacterView'を列挙することができます。 – Fantattitude

+0

@Fantattitude私はちょうどそれをもう一度読んで、まだ失われた – Honey

答えて

2

str.charactersString.CharacterView返します - あなたが(ちょうどそれを行うだろうArray(str.characters)str.characters.map{...}を行うのに対し)新しいバッファに内容をコピーすることなく、それらにアクセスすることができ、文字列の文字にビューを提示します。

String.CharacterView自体がString.CharacterView.Index(不透明インデックス型)によってインデックス付けされるCollectionと拡張書記素クラスタを表すタイプCharacter(の要素(当然)を有している - 一般読者が「に単一の文字を」何を検討すると)。

let str = "Hello" 

// indexed by a String.Index (aka String.CharacterView.Index) 
let indexOfO = str.characters.index(of: "o")! 

// element of type Character 
let o = str.characters[indexOfO] 

// String.CharacterView.IndexDistance (the type used to offset an index) is of type Int 
let thirdLetterIndex = str.characters.index(str.startIndex, offsetBy: 2) 

// Note that although String itself isn't a Collection, it implements some convenience 
// methods, such as index(after:) that simply forward to the CharacterView 
let secondLetter = str[str.index(after: str.startIndex)] 

それはむしろ例えばより特別String.CharacterView.IndexIntによって索引付けされていることを理由は、文字が異なるバイト長で符号化することができることです。したがって、サブスクリプトは潜在的に(非ASCIIストアドストリングの場合)O(n)オペレーション(エンコードされた文字列を反復処理する必要があります)です。しかし、Intのサブスクリプトは、O(1)操作(安く、反復を必要としない)のように当然のように感じます。それは私が簡単に列挙、または配列に変換するかをマッピングするが、その後、それ自体、それを印刷したり、その中にインデックス付けた場合にもするので、意味不明

を印刷することができることである方法

str.characters[str.characters.index(str.characters.startIndex, offsetBy: n)] // feels O(n) 
str.characters[n] // illegal, feels O(1) 

あなたはそれがCollectionだから、列挙Arrayと​​単にString.CharacterViewに変換することができます - ので、for ... inmap(_:)との使用だけでなく、ループ可能にし、Sequenceに準拠しますコンストラクタ、とりわけ。

str.charactersの結果を印刷するのは、CustomStringConvertibleまたはCustomDebugStringConvertibleのいずれかに準拠して独自のカスタムテキスト表現を提供していないということです。

+0

あなたの最後の段落のために非常に特にありがとう。いくつかの行は私がここで前後に来る必要があります。 :) – Honey

+0

@ハニーハッピーに役立つ:) – Hamish

関連する問題