2016-07-12 6 views
0

2単語に含まれる文字を比較しています。これを達成するために、Set(別名NSSet)がこのタスクを達成する方法のように思えました。私は試合で偽陽性を返すことを発見したので、CountedSet(別名NSCountedSet)を使用しようとしています。`CountedSet`初期化の問題

Setを問題なく初期化できますが、CountedSetイニシャライザを動作させることができません。ここで私はStringで始まる、私は...

をやったものだ:

// Let's say myTextField.text = "test" 
let textFieldCharacters = myTextField.text?.characters 
// word is a string from the ENABLE list of words 
let wordCharacters = word.characters 

その後、私はArrayに文字をダンプ:

var wordCharactersArray = [Character]() 
for character in wordCharacters { 
    wordCharacterArray.append(character) 
} 


var textFieldCharactersArray = [Character]()  
for character in textFieldCharacters { 
    wordCharacterArray.append(character) 
} 

その後、私は文字からSetを作成配列:

let textFieldSet = Set<Character>(textFieldCharactersArray) 
let wordSet = Set<Character>(wordCharactersArray) 

最後に、 textFieldSetは以下とwordSetのスーパーセットである:

textFieldSet.isSuperset(of: wordSet) 

myTextField.textは、「テスト」で、私はその文字wordSetのスーパーセットですwordの値が、カウントを返していた場合、戻って私の例に行きます個々の要素の文字数が一致しないmyTextField.text

私の問題の調査では、CountedSet(fka NSCountedSet)が見つかりました。これは私の問題を解決するものと思われます。私はそうのような文字の2セットを初期化しようとした

public convenience init(array: [AnyObject]) 
public convenience init(set: Set<NSObject>) 

::私はセット

Cannot convert value of type '[Character]' to expected argument type '[AnyObject]'.

だから、私は次のエラーを取得する

let textFieldSet = CountedSet(array: textFieldCharacterArray) 
let wordSet = CountedSet(array: wordCharacterArray) 

これは、2つのメソッドのシグネチャを持っています次のようにセットを初期化しようとしました:

次のエラー得

'AnyObject' is not a subtype of 'Character'

は、私はまた、メソッドのシグネチャごとに、SetCountedSetを初期化しようとしましたが、私はあまりにも、それを実行しようとするとき、私はエラーを取得します。

CountedSetを初期化する方法をお勧めします。

+2

は違いを確認するには?たとえば、 'let textFieldCharacters =" test ".characters.map {String($ 0)}; let textFieldSet = CountedSet(array:textFieldCharacters) 'が動作するはずです。 – Moritz

+0

ありがとうございました!それは1)私を正しい道に導き、2)コードをトリミングするための鍵でした。 – Adrian

答えて

1

要素の表示だけでなくカウントも比較する必要がある場合は、CountedSetを使用する必要があります。これは、swift 3.0の場合はNSCountedSetの名前です。実行している問題は、CountedSetはオブジェクトであり、Charactersではない要素のみを受け入れることができます。 Eric Dがコメントで指摘したように、この問題を回避するには[Character][String]にマッピングし、[NSString]にブリッジします。

Setを使用すると、このタイプの要素で初期化されるSwiftコレクション型であるため、この問題は発生しません。このため、Set[Character]に初期化することができます。文字列の代わりに文字を使用しますだけで簡単に回避策のアイデア

let word = "helo" 
let wordCharacters = Array(word.characters) 
let wordSet = Set(wordCharacters) 
let wordCharStrings = wordCharacters.map{String($0)} 
let wordCountedSet = CountedSet(array: wordCharStrings) 

let textField = "hello" 
let textFieldCharacters = Array(textField.characters) 
let textSet = Set(textFieldCharacters) 
let textFieldCharStrings = textFieldCharacters.map{String($0)} 
let textFieldCountedSet = CountedSet(array: textFieldCharStrings) 

textFieldCountedSet.isSubset(of: wordCountedSet as! Set<NSObject>) // returns false, but if word had two or more l's it would return true 
textSet.isSubset(of: wordSet) // returns true 
+1

ありがとう!私はこの行に 'wordCountedSet.isSubset(set:textFieldCountedSet as Set)というコンパイラエラーがあります。' as 'を 'as!'に変更して、この警告を出しました:" CountedSetから '無関係な型にキャスト' Set 私はコードを実行し、警告にもかかわらずうまくいった。 – Adrian

関連する問題