Подтвердить что ты не робот

Как преобразовать Swift Character в String?

Я хочу вернуть первую букву String как String вместо Character:

func firstLetter() -> String {
    return self.title[0]
}

Однако, с приведенным выше, я получаю Character is not convertible to String. Каков правильный способ преобразования символа в строку?

Этот ответ предлагает создать расширение подстроки, но декларация для String уже имеет индексный метод:

subscript (i: String.Index) -> Character { get }

Является ли этот ответ устаревшим или эти две разные вещи?

4b9b3361

Ответ 1

Почему вы не используете String-интерполяцию для преобразования символа в строку?

return "\(firstChar)"

Ответ 2

Только первый символ? Как насчет:

var str = "This is a test"
var result = str[str.startIndex..<str.startIndex.successor()] // "T": String

Возвращает строку (как и следовало ожидать, с индексом диапазона строки) и работает до тех пор, пока существует хотя бы один символ.

Это немного короче и, предположительно, может быть намного быстрее, но, на мой взгляд, он не читается достаточно четко:

var result = str[str.startIndex...str.startIndex]

Ответ 3

Как и у 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)
}

Ответ 4

Я сделал несколько исследований для одного и того же типа вопросов, и я нашел этот способ для получения любого символа из любой строки:

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])
}

Я надеюсь, что это то, что вам нужно

Ответ 5

let str = "My String"
let firstChar = String(str.characters.first!)

Ответ 6

Я пытался получить одиночные символы из обработанной строки в 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)])

Ответ 7

Это то, что я сделал бы:

func firstLetter() -> String {
var x:String = self.title[0]
    return x
}

Ответ 8

Во-первых: Ответ, на который вы ссылаетесь, по-прежнему имеет значение. Он добавляет индексы на основе Integer к String (например, с использованием функции advance()). Встроенный строковый индекс поддерживает только двунаправленныеИндексы (думайте о них скорее как курсоры, а не как массивные индексы). Это, скорее всего, потому, что символы обычно не сохраняются как таковые в строковой структуре, а как UTF-8 или UTF-16. Тогда для позиционного доступа к символам требуется декодирование (именно поэтому - в дополнение к дополнительному копированию - массив (строка) [idx] действительно дорог).

Если вы действительно хотите первый char, вы можете сделать это:

extension String {
  var firstCharacterAsString : String {
    return self.startIndex == self.endIndex
      ? ""
      : String(self[self.startIndex])
  }
}

Ответ 9

Самый простой способ - return "\(self.title[0])".