26

特定の文字列に文字が含まれているかどうかを確認しようとしています。

これまでのところ、文字のセットとして出くわしましNSCharacterSet.letterCharacterSet()たが、そのセットの文字が指定された文字列に含まれているかどうかを確認するのに苦労しています。このコードを使用すると、次のエラーが表示されます。

「文字」は「unichar」に変換できません

次のコードの場合:

for chr in input{
    if letterSet.characterIsMember(chr){
        return "Woah, chill out!"
    }
}
4

3 に答える 3

55

NSCharacterSet次の方法で使用できます。

let letters = NSCharacterSet.letters

let phrase = "Test case"
let range = phrase.rangeOfCharacter(from: characterSet)

// range will be nil if no letters is found
if let test = range {
    println("letters found")
}
else {
   println("letters not found")
}

または、これも行うことができます:

func containsOnlyLetters(input: String) -> Bool {
   for chr in input {
      if (!(chr >= "a" && chr <= "z") && !(chr >= "A" && chr <= "Z") ) {
         return false
      }
   }
   return true
}

Swift 2 では:

func containsOnlyLetters(input: String) -> Bool {
   for chr in input.characters {
      if (!(chr >= "a" && chr <= "z") && !(chr >= "A" && chr <= "Z") ) {
         return false
      }
   }
   return true
}

それはあなた次第です、道を選んでください。これがお役に立てば幸いです。

于 2015-04-08T16:53:41.953 に答える
8

独自のソリューションを展開するのではなく、String組み込みの範囲関数を使用する必要があります。NSCharacterSetこれにより、柔軟性も大幅に向上します (必要に応じて、大文字と小文字を区別しない検索など)。

let str = "Hey this is a string"
let characterSet = NSCharacterSet(charactersInString: "aeiou")

if let _ = str.rangeOfCharacterFromSet(characterSet, options: .CaseInsensitiveSearch) {
    println("true")
}
else {
    println("false")
}

探し"aeiou"ている文字に置き換えます。

柔軟性は劣りますが、swift で利用できる関数はどれでも使用できるという点が、Swift の楽しい点ですSequence。だからあなたはこれを行うことができます:

contains("abc", "c")

もちろん、これは個々のキャラクターに対してのみ機能し、柔軟性がなく、お勧めできません。

于 2015-04-08T17:53:54.303 に答える
4

の問題.characterIsMemberは、unichar(の typealias UInt16) が必要なことです。

utf16文字列のビューを使用して入力を繰り返すと、次のように機能します。

let set = NSCharacterSet.letterCharacterSet()
for chr in input.utf16 {
    if set.characterIsMember(chr) {
        println("\(chr) is a letter")
    }
}

contains存在/非存在のみを確認したい場合は、ループをスキップしてアルゴリズムを使用することもできます。

if contains(input.utf16, { set.characterIsMember($0) }) {
    println("contains letters")
}
于 2015-04-08T16:52:41.320 に答える