web-dev-qa-db-ja.com

Swiftで文字列に文字が含まれているかどうかを確認するにはどうすればよいですか?

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

これまでのところ、文字セットとしてNSCharacterSet.letterCharacterSet()に遭遇しましたが、そのセット内の文字が指定された文字列にあるかどうかを確認するのに問題があります。このコードを使用すると、次のようなエラーが表示されます。

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

次のコードの場合:

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

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
}

In 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
}

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

42
Victor Sigler

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

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すべて同じように注意してください、Sequencesで利用可能な関数のいずれかを使用できるということです。

contains("abc", "c")

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

7
Jarsen

.characterIsMemberの問題は、unicharUInt16の型エイリアス)を取ることです。

文字列の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")
}
4