www whatwg what spec language español 3wc string indexing swift character

whatwg - ¿Cómo convertir Swift Character a String?



whatwg español (9)

¿Por qué no utilizas la interpolación de cadenas para convertir el personaje en una cadena?

return "/(firstChar)"

Quiero devolver la primera letra de una String como una String lugar de como un Character :

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

Sin embargo, con lo anterior obtengo el Character is not convertible to String . ¿Cuál es la forma correcta de convertir un personaje en una cadena?

Esta respuesta sugiere crear una extensión de subíndice, pero la declaración para String ya tiene un método de subíndice:

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

¿Es esa respuesta obsoleta, o son estas dos cosas diferentes?


¿Solo el primer personaje? Qué tal si:

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

Devuelve una Cadena (como cabría esperar con un subíndice de rango de una Cadena) y funciona siempre que haya al menos un carácter.

Esto es un poco más corto, y probablemente podría ser una fracción más rápido, pero en mi opinión no se lee con tanta claridad:

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


A partir de Swift 2.3 / 3.0 + puedes hacer algo como esto:

func firstLetter() -> String { guard let firstChar = self.title.characters.first else { return "" // If title is nil return empty string } return String(firstChar) }

O si estás de acuerdo con String opcional:

func firstLetter() -> String? { guard let firstChar = self.title.characters.first else { return nil } return String(firstChar) }

Actualización para Swift 4 , también creo que una extensión es mejor

extension String{ func firstLetter() -> String { guard let firstChar = self.first else { return "" } return String(firstChar) }


Estaba tratando de obtener caracteres individuales de una cadena analizada en una cadena. Así que quería B desde helpAnswer en formato de cadena, no en formato de CARACTER, para poder imprimir los caracteres individuales en un cuadro de texto. Esto funciona muy bien. No sé acerca de la eficiencia de la misma. Pero funciona. SWIFT 3.0
Gracias por la ayuda de todos ...

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


Esto es lo que yo haría:

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


Hice algunas investigaciones para el mismo tipo de pregunta, y encontré esta manera para obtener cualquier carácter de cualquier cadena:

func charAsString(str:String, index:Int) -> String { return String(Array(str)[index]) }

y para el primer personaje que llamas

var firstCharAsString = firstLetter("yourString",0)

No soy muy bueno en programación todavía, pero creo que esto hará lo que quieras

EDITAR:

Simplificado para su necesidad:

func firstChar(str:String) -> String { return String(Array(str)[0]) }

Espero que sea lo que necesites.


La forma más sencilla es return "/(self.title[0])" .


Primero: la respuesta a la que te refieres sigue siendo relevante. Agrega índices basados ​​en números enteros a la cadena (por ejemplo, utilizando advance ()). El subíndice String incorporado solo admite índices bidireccionales (piense en ellos más como cursores, no como índices de matriz). Esto es probable porque los caracteres no suelen almacenarse como tales en la estructura de cadena, sino como UTF-8 o UTF-16. El acceso posicional a los caracteres requiere una decodificación (por lo que, además de la copia adicional, la matriz (cadena) [idx] es realmente costosa).

Si realmente quieres el primer personaje, puedes hacer esto:

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


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