Swift Преобразование символа в строку
У меня проблема с преобразованием типа символа в тип String. Прежде всего, у меня есть расширение расширения String для нахождения n-го символа в String.
extension String {
func characterAtIndex(index: Int) -> Character? {
var cur = 0
for char in self {
if cur == index {
return char
}
cur++
}
return nil
}
}
Я получаю то, что хочу, с этим расширением класса. Однако, когда я использую этот n-й символ для заголовка своего пользовательского UIButton, выдается сообщение об ошибке. Мой класс Uibutton
class hareketliHarfler: UIButton {
init(frame: CGRect) {
super.init(frame: frame)
// Initialization code
}
func getLetter(letter:String!){
self.titleLabel.text = letter
}
}
Ошибка при попытке получить доступ к функции getLetter (letter: String). Вот пример основных кодов контроллера:
var harfim = hareketliHarfler(frame: CGRectMake(100,100,100,100))
var str="This is my String"
var bufi=str.characterAtIndex(3)
harfim.getLetter(bufi as AnyObject) ****
В * разделе я пытаюсь .getLetter(bufi),.getLetter(bufi as String) также пытаюсь изменить тип параметра функции. Посмотрите: func getLetter (буква: символ!) Или func getLetter (буква: AnyObject!)... и т.д.
Не нашел пути. Нужна помощь по этому поводу. Спасибо вам
Ответы
Ответ 1
Ваша проблема довольно проста: функция characterAtIndex возвращает символ, а self.titleLabel.text - это String. Вы не можете конвертировать между ними неявно. Самый простой способ - превратить символ в строку с помощью инициализатора строки:
// ch will be Character? type.
if let ch = str.characterAtIndex(3) {
// Initialise a new String containing the single character 'ch'
harfim.getLetter(String(ch))
} else {
// str didn't have a third character.
}
В отличие от других решений, это безопасно для необычных символов Unicode и не будет инициализировать потенциально большой массив или перебрать всю строку только для получения третьего символа.
Ответ 2
Как насчет простой
String(theCharacter)
Работает в Swift 4
Ответ 3
Измените это:
var bufi=str.characterAtIndex(3)
harfim.getLetter(bufi as AnyObject)
:
harfim.getLetter(String(Array(str)[3]))
Итак, что происходит здесь:
-
мы создаем массив из нашей строки. Элементы массива - это символы из исходной строки. Такие нарушения правильно отслеживают символы, которые представлены последовательностями из двух или более кодовых точек. Например. emoji или флаг, отмеченный @MartinR.
-
Мы обращаемся к элементу на 4-й позиции.
Обратите внимание, что по мере того как мы кладем массив из исходной строки, лучше использовать этот метод только с короткими строками и избегать его в часто повторяющихся процедурах. Но в вашем случае это кажется ОК.
Ответ 4
Можно также использовать Character(text).isNumber
, если вы хотите получить локализованные номера.
Ссылка:https://developer.apple.com/documentation/swift/character/3127015-isnumber