Soru Swift: Mektubun Alfanümerik veya Rakam olup olmadığını nasıl öğrenebilirim


Aşağıdaki dizede harfler, rakamlar ve özel karakterlerin sayısını saymak istiyorum:

let phrase = "The final score was 32-31!"

Denedim:

for tempChar in phrase {
    if (tempChar >= "a" && tempChar <= "z") {
       letterCounter++
    }
// etc.

ama hata alıyorum. Bununla ilgili her çeşit varyasyonu denedim - hala hata alıyorum - gibi:

could not find an overload for '<=' that accepts the supplied arguments

Herhangi bir ipucu?


32
2017-07-01 04:51


Menşei




Cevaplar:


Swift 3 için güncelleme:

let letters = CharacterSet.letters
let digits = CharacterSet.decimalDigits

var letterCount = 0
var digitCount = 0

for uni in phrase.unicodeScalars {
    if letters.contains(uni) {
        letterCount += 1
    } else if digits.contains(uni) {
        digitCount += 1
    }
}

(Eski Swift sürümleri için önceki cevap)

Olası bir Swift çözümü:

var letterCounter = 0
var digitCount = 0
let phrase = "The final score was 32-31!"
for tempChar in phrase.unicodeScalars {
    if tempChar.isAlpha() {
        letterCounter++
    } else if tempChar.isDigit() {
        digitCount++
    }
}

Güncelleştirme: Yukarıdaki çözüm sadece ASCII karakter kümesindeki karakterlerle çalışır, yani Ä, é veya ø harflerini tanımamaktadır. Aşağıdaki alternatif çözüm kullanır NSCharacterSet Karakterleri test edebilen Vakıf çerçevesinden Unicode karakter sınıflarına dayanarak:

let letters = NSCharacterSet.letterCharacterSet()
let digits = NSCharacterSet.decimalDigitCharacterSet()

var letterCount = 0
var digitCount = 0

for uni in phrase.unicodeScalars {
    if letters.longCharacterIsMember(uni.value) {
        letterCount++
    } else if digits.longCharacterIsMember(uni.value) {
        digitCount++
    }
}

Güncelleme 2:  Xcode 6 beta 4'ten itibaren, ilk çözüm artık çalışmıyor, çünkü isAlpha() ve ilgili (ASCII-only) yöntemleri Swift'den kaldırılmıştır. İkinci çözüm hala çalışıyor.


50
2017-07-01 05:04



Evet, bu mükemmel - "isAlpha" ve "isDigit" hakkında nasıl bir şey öğrendin ????? :-) Var olanları bile bilmiyordum. (Cidden - onlara baktınız mı ya da önceden seyahat ettiniz mi?) - sirab333
@ Sirab333: isalpha() ve arkadaşları C'de iyi bilinmektedir, bakınız örn. developer.apple.com/library/ios/documentation/System/Conceptual/.... Bu yüzden onları Swift'den nasıl kullanacağımı öğrenmek için "sadece" vardı. - Ama bunun sadece ASCII karakterleri için çalıştığına dikkat edin. "Ä", "è" veya "ø" gibi "yabancı dillerden" gelen harfleri tanımıyor. - Martin R
ve tanır + ve - rakam olarak - Christian Dietrich
İlginç. C, C #, C ++ ya da başka bir C - hiç olmadı. Nesne-C'ye atladım ve geriye hiç bakmadım. Sonuç olarak, bunun "meşru" bir çözüm olduğunu mu söylüyorsunuz ya da herhangi bir C katılımı olmadan bunu yapmak için daha "saf" bir Swift-only yolu var mı? - sirab333
Swift 3.0 çalışmıyor - Warpzit


UnicodeScalars değerlerini kullanın

let phrase = "The final score was 32-31!"
var letterCounter = 0, digitCounter = 0
for scalar in phrase.unicodeScalars {
    let value = scalar.value
    if (value >= 65 && value <= 90) || (value >= 97 && value <= 122) {++letterCounter}
    if (value >= 48 && value <= 57) {++digitCounter}
}
println(letterCounter)
println(digitCounter)

4
2017-10-15 15:34





Mektup ve rakam için kısa bir uzantı oluşturdum. String

extension String {
  var letterCount : Int {
    return self.unicodeScalars.filter({ CharacterSet.letters.contains($0) }).count
  }

  var digitCount : Int {
   return self.unicodeScalars.filter({ CharacterSet.decimalDigits.contains($0) }).count
  }
}

ya da herhangi bir sayım almak için bir işlev CharacterSet sen koy

extension String {    
  func characterCount(for set: CharacterSet) -> Int {
    return self.unicodeScalars.filter({ set.contains($0) }).count
  }
}

kullanımı:

let phrase = "the final score is 23-13!"
let letterCount = phrase.characterCount(for: .letters)

0
2018-04-11 10:10