特定の文字列に文字が含まれているかどうかを確認しようとしています。
これまでのところ、文字セットとしてNSCharacterSet.letterCharacterSet()
に遭遇しましたが、そのセット内の文字が指定された文字列にあるかどうかを確認するのに問題があります。このコードを使用すると、次のようなエラーが表示されます。
「Character」は「unichar」に変換できません
次のコードの場合:
for chr in input{
if letterSet.characterIsMember(chr){
return "Woah, chill out!"
}
}
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
}
それはあなた次第です、方法を選択してください。これがお役に立てば幸いです。
独自のソリューションを展開するのではなく、String
でNSCharacterSet
sに組み込まれた範囲関数を使用する必要があります。これにより、柔軟性が大幅に向上します(必要に応じて大文字と小文字を区別しない検索など)。
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すべて同じように注意してください、Sequence
sで利用可能な関数のいずれかを使用できるということです。
contains("abc", "c")
もちろんこれは個々のキャラクターに対してのみ機能し、柔軟性がなく推奨されません。
.characterIsMember
の問題は、unichar
(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")
}