Ответ 1
Почему вы не используете String-интерполяцию для преобразования символа в строку?
return "\(firstChar)"
Я хочу вернуть первую букву String
как String
вместо Character
:
func firstLetter() -> String {
return self.title[0]
}
Однако, с приведенным выше, я получаю Character is not convertible to String
. Каков правильный способ преобразования символа в строку?
Этот ответ предлагает создать расширение подстроки, но декларация для String
уже имеет индексный метод:
subscript (i: String.Index) -> Character { get }
Является ли этот ответ устаревшим или эти две разные вещи?
Почему вы не используете String-интерполяцию для преобразования символа в строку?
return "\(firstChar)"
Только первый символ? Как насчет:
var str = "This is a test"
var result = str[str.startIndex..<str.startIndex.successor()] // "T": String
Возвращает строку (как и следовало ожидать, с индексом диапазона строки) и работает до тех пор, пока существует хотя бы один символ.
Это немного короче и, предположительно, может быть намного быстрее, но, на мой взгляд, он не читается достаточно четко:
var result = str[str.startIndex...str.startIndex]
Как и у Swift 2.3/3.0 +, вы можете сделать что-то вроде этого:
func firstLetter() -> String {
guard let firstChar = self.title.characters.first else {
return "" // If title is nil return empty string
}
return String(firstChar)
}
Или, если вы в порядке с необязательной строкой:
func firstLetter() -> String? {
guard let firstChar = self.title.characters.first else {
return nil
}
return String(firstChar)
}
Обновление для Swift 4, также подумайте, что расширение лучше
extension String{
func firstLetter() -> String {
guard let firstChar = self.first else {
return ""
}
return String(firstChar)
}
Я сделал несколько исследований для одного и того же типа вопросов, и я нашел этот способ для получения любого символа из любой строки:
func charAsString(str:String, index:Int) -> String {
return String(Array(str)[index])
}
и для первого символа, который вы вызываете
var firstCharAsString = firstLetter("yourString",0)
Я еще не очень хорошо разбираюсь в программировании, но думаю, что это сделает то, что вы хотите
EDIT:
Упрощен для ваших нужд:
func firstChar(str:String) -> String {
return String(Array(str)[0])
}
Я надеюсь, что это то, что вам нужно
let str = "My String"
let firstChar = String(str.characters.first!)
Я пытался получить одиночные символы из обработанной строки в String.
Поэтому я хотел, чтобы B от helpAnswer в формате String не был CHARACTER, поэтому я мог распечатывать отдельные символы в текстовом поле.
Это отлично работает. Я не знаю об эффективности этого.
Но это работает. SWIFT 3.0
Спасибо за помощь всем...
var helpAnswer = "ABC"
var String1 = ""
var String2 = ""
var String3 = ""
String1 = (String(helpAnswer[helpAnswer.index(helpAnswer.startIndex, offsetBy: 0)]))
String2 = (String(helpAnswer[helpAnswer.index(helpAnswer.startIndex, offsetBy: 1)]))
String3 = (String(helpAnswer[helpAnswer.index(helpAnswer.startIndex, offsetBy: 1)])
Это то, что я сделал бы:
func firstLetter() -> String {
var x:String = self.title[0]
return x
}
Во-первых: Ответ, на который вы ссылаетесь, по-прежнему имеет значение. Он добавляет индексы на основе Integer к String (например, с использованием функции advance()). Встроенный строковый индекс поддерживает только двунаправленныеИндексы (думайте о них скорее как курсоры, а не как массивные индексы). Это, скорее всего, потому, что символы обычно не сохраняются как таковые в строковой структуре, а как UTF-8 или UTF-16. Тогда для позиционного доступа к символам требуется декодирование (именно поэтому - в дополнение к дополнительному копированию - массив (строка) [idx] действительно дорог).
Если вы действительно хотите первый char, вы можете сделать это:
extension String {
var firstCharacterAsString : String {
return self.startIndex == self.endIndex
? ""
: String(self[self.startIndex])
}
}
Самый простой способ - return "\(self.title[0])"
.