¿Cómo convierto una Swift Array en una cadena?

Sé cómo hacerlo programáticamente, pero estoy seguro de que hay una forma incorporada …

Cada idioma que he utilizado tiene algún tipo de representación textual predeterminada para una colección de objetos que escupirá cuando intente concatenar la matriz con una cadena, o pasarlo a una función de impresión (), etc. ¿Tiene el lenguaje Swift de Apple? ¿Tiene una forma incorporada de convertir fácilmente una matriz en una cadena, o siempre tenemos que ser explícitos al codificar una matriz?

Si la matriz contiene cadenas, puede usar el método de join String :

 var array = ["1", "2", "3"] let stringRepresentation = "-".join(array) // "1-2-3" 

En Swift 2 :

 var array = ["1", "2", "3"] let stringRepresentation = array.joinWithSeparator("-") // "1-2-3" 

Esto puede ser útil si desea usar un separador específico (hypen, blank, coma, etc.).

De lo contrario, simplemente puede usar la propiedad de description , que devuelve una representación de cadena de la matriz:

 let stringRepresentation = [1, 2, 3].description // "[1, 2, 3]" 

Sugerencia: cualquier objeto que implemente el protocolo Printable tiene una propiedad de description . Si adoptas ese protocolo en tus propias clases / estructuras, también les haces imprimir de forma amigable

En Swift 3

  • join se joined , ejemplo [nil, "1", "2"].flatMap({$0}).joined()
  • joinWithSeparator se joined(separator:) (solo disponible para Array of Strings)

Con Swift 3, de acuerdo con sus necesidades, puede elegir uno de los siguientes bloques de código.


Convertir una matriz de Character en una String sin separador:

 let characterArray: [Character] = ["J", "o", "h", "n"] let string = String(characterArray) print(string) // prints "John" 

Convertir una matriz de String en una String sin separador:

 let stringArray = ["Foo", "Bar", "Baz"] let characterArray = stringArray.flatMap { String.CharacterView($0) } //let characterArray = stringArray.flatMap { $0.characters } // also works let string = String(characterArray) print(string) // prints "FooBarBaz" 

Convertir una matriz de String en una String con un separador entre palabras:

 let stringArray = ["Bob", "Dan", "Bryan"] let string = stringArray.joined(separator: " ") print(string) // prints "Bob Dan Bryan" 

Convertir una matriz de String en una String con un separador entre caracteres:

 let stringArray = ["car", "bike", "boat"] let stringArray2 = stringArray.flatMap { String.CharacterView($0) }.map { String($0) } let string = stringArray2.joined(separator: ", ") print(string) // prints "c, a, r, b, i, k, e, b, o, a, t" 

Convertir una matriz de Float en una String con un separador entre números:

 let floatArray = [12, 14.6, 35] let stringArray = floatArray.flatMap { String($0) } let string = stringArray.joined(separator: "-") print(string) // prints "12.0-14.6-35.0" 

Swift 2.0 Xcode 7.0 beta 6 en adelante usa joinWithSeparator() lugar de join() :

 var array = ["1", "2", "3"] let stringRepresentation = array.joinWithSeparator("-") // "1-2-3" 

joinWithSeparator se define como una extensión en SequenceType

 extension SequenceType where Generator.Element == String { /// Interpose the `separator` between elements of `self`, then concatenate /// the result. For example: /// /// ["foo", "bar", "baz"].joinWithSeparator("-|-") // "foo-|-bar-|-baz" @warn_unused_result public func joinWithSeparator(separator: String) -> String } 

Swift 3

 ["I Love","Swift"].joined(separator:" ") // previously joinWithSeparator(" ") 

En Swift 4

 let array:[String] = ["Apple", "Pear ","Orange"] array.joined(separator: " ") 

Para cambiar una matriz de cadenas opcionales / no opcionales

 //Array of optional Strings let array : [String?] = ["1",nil,"2","3","4"] //Separator String let separator = "," //flatMap skips the nil values and then joined combines the non nil elements with the separator let joinedString = array.flatMap{ $0 }.joined(separator: separator) //Use Compact map in case of **Swift 4** let joinedString = array.compactMap{ $0 }.joined(separator: separator print(joinedString) 

Aquí flatMap , compactMap omite los valores nulos en la matriz y agrega los otros valores para dar una cadena unida.

En Swift 2.2 es posible que deba convertir su matriz a NSArray para usar los componentesJoinedByString (“,”)

 let stringWithCommas = (yourArray as NSArray).componentsJoinedByString(",") 

Como nadie ha mencionado reducir, aquí está:

 [0,1,1,0].map{"\($0)"}.reduce(""){$0+$1}//"0110" 

En el espíritu de la progtwigción funcional 🤖

El mío funciona en NSMutableArray con componentsJoinedByString

 var array = ["1", "2", "3"] let stringRepresentation = array.componentsJoinedByString("-") // "1-2-3" 
 let arrayTemp :[String] = ["Mani","Singh","iOS Developer"] let stringAfterCombining = arrayTemp.componentsJoinedByString(" ") print("Result will be >>> \(stringAfterCombining)") 

El resultado será >>> Mani Singh iOS Developer

Si quieres eliminar cadenas vacías en la matriz.

 ["Jet", "Fire"].filter { !$0.isEmpty }.joined(separator: "-") 

Si quiere filtrar valores nulos también:

 ["Jet", nil, "", "Fire"].flatMap { $0 }.filter { !$0.isEmpty }.joined(separator: "-") 

El equivalente de Swift a lo que estás describiendo es la interpolación de cadenas. Si está pensando en cosas como JavaScript haciendo "x" + array , el equivalente en Swift es "x\(array)" .

Como nota general, hay una diferencia importante entre la interpolación de cadenas frente al protocolo Printable . Solo ciertas clases se ajustan a Printable . Cada clase puede ser una cadena interpolada de alguna manera. Eso es útil al escribir funciones genéricas. No tiene que limitarse a clases Printable .

Crear extensión para una Array :

 extension Array { var string: String? { do { let data = try JSONSerialization.data(withJSONObject: self, options: [.prettyPrinted]) return String(data: data, encoding: .utf8) } catch { return nil } } } 

Puede imprimir cualquier objeto utilizando la función de impresión

o use \(name) para convertir cualquier objeto en una cadena.

Ejemplo:

 let array = [1,2,3,4] print(array) // prints "[1,2,3,4]" let string = "\(array)" // string == "[1,2,3,4]" print(string) // prints "[1,2,3,4]" 

Un separador puede ser una mala idea para algunos idiomas como el hebreo o el japonés. Prueba esto:

 // Array of Strings let array: [String] = ["red", "green", "blue"] let arrayAsString: String = array.description let stringAsData = arrayAsString.data(using: String.Encoding.utf16) let arrayBack: [String] = try! JSONDecoder().decode([String].self, from: stringAsData!) 

Para otros tipos de datos, respectivamente:

 // Set of Doubles let set: Set = [1, 2.0, 3] let setAsString: String = set.description let setStringAsData = setAsString.data(using: String.Encoding.utf16) let setBack: Set = try! JSONDecoder().decode(Set.self, from: setStringAsData!) 

si tiene lista de matriz de cadenas, luego convierta a Int.

 let arrayList = list.map { Int($0)!} arrayList.description 

le dará valor de cadena

PARA SWIFT 3:

 func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { if textField == phoneField { let newString = NSString(string: textField.text!).replacingCharacters(in: range, with: string) let components = newString.components(separatedBy: NSCharacterSet.decimalDigits.inverted) let decimalString = NSString(string: components.joined(separator: "")) let length = decimalString.length let hasLeadingOne = length > 0 && decimalString.character(at: 0) == (1 as unichar) if length == 0 || (length > 10 && !hasLeadingOne) || length > 11 { let newLength = NSString(string: textField.text!).length + (string as NSString).length - range.length as Int return (newLength > 10) ? false : true } var index = 0 as Int let formattedString = NSMutableString() if hasLeadingOne { formattedString.append("1 ") index += 1 } if (length - index) > 3 { let areaCode = decimalString.substring(with: NSMakeRange(index, 3)) formattedString.appendFormat("(%@)", areaCode) index += 3 } if length - index > 3 { let prefix = decimalString.substring(with: NSMakeRange(index, 3)) formattedString.appendFormat("%@-", prefix) index += 3 } let remainder = decimalString.substring(from: index) formattedString.append(remainder) textField.text = formattedString as String return false } else { return true } } 

Si la pregunta es algo así: tobeFormattedString = [“a”, “b”, “c”] Output = “abc”

String(tobeFormattedString)