Подсчитайте, сколько раз в строке в Swift встречается специальный символ (без пробела) - PullRequest
0 голосов
/ 11 января 2019

Эта функция ищет, сколько раз символ появляется в строке:

let str = "الصَّبَاْحُ جَمِيْلٌ"
let char: Character = "َ"


func SpecificLetterCount(_ str:String, _ char:Character) -> Int {
let letters = Array(str); var count = 0
for letter in letters {
    if letter == char {
        count += 1
    }
}
return count
}

print(SpecificLetterCount(str, char)) //Prints 0 , where in fact it should find it 3 times in that string!

В этом случае результат 0, где на самом деле он должен найти его 3 раза в этой строке !, но поскольку это не пробел (специальный символ), он не может найти его сам по себе. То же самое происходит с этим персонажем: (e + ́) = é, где я не могу найти (́) сам!

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Основываясь на превосходном понимании Почему символы эмодзи, такие как ?‍?‍?‍?, так странно трактуются в строках Swift? , вы можете выполнить буквальный поиск :

func specificLetterCount(_ str:String, _ char:Character) -> Int {
    var count = 0
    var pos = str.startIndex
    while let range = str[pos...].range(of: String(char), options: .literal) {
        count += 1
        pos = range.upperBound
    }
    return count
}

Это дает ожидаемый результат:

let str = "الصَّبَاْحُ جَمِيْلٌ"
let char: Character = "َ"
print(specificLetterCount(str, char)) // 3
0 голосов
/ 11 января 2019

Вам придется работать со скалярами Юникода вместо символов (так называемые кластеры расширенных графем ).

Небезопасно пример:

func SpecificLetterCount(_ str:String, _ char:Character) -> Int {
    var count = 0
    for s in  str.unicodeScalars {
        print(s)
        if s == char.unicodeScalars.first! {
            count += 1
        }
    }

    return count
}

Код небезопасен из-за char.unicodeScalars.first!, который ожидает, что символ состоит только из одного скаляра. Я оставляю это как упражнение, чтобы сделать эту функцию безопасной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...