¿Cómo convierto una matriz Swift a una cadena?

Sé cómo hacerlo mediante progtwigción, pero estoy seguro de que hay una forma incorporada …

Cada idioma que he usado tiene algún tipo de representación textual pnetworkingeterminada para una colección de objects que escupirá cuando intente concatenar la matriz con una cadena o la pase a una function de printing (), etc. ¿El lenguaje Swift de Apple ¿Tiene una forma incorporada de convertir fácilmente una matriz en una secuencia o siempre tenemos que ser explícitas cuando se estratifica una matriz?

Si la matriz contiene cadenas, puede usar el método de join la 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, comma, etc.).

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

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

Sugerencia: cualquier object que implemente el protocolo Printable tiene una propiedad de description . Si adoptas ese protocolo en tus propias classs / estructuras, también las imprimes amigables.

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" 

Convirtiendo 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 numbers:

 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(" ") 

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

En Swift 2.2, puede que tenga que convertir su matriz en NSArray para usar componentsJoinedByString (",")

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

Como nadie ha mencionado networkingucir, aquí está:

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

En el espíritu de la functional programming 🤖

Swift equivalente a lo que estás describiendo es una interpolación de cadena. Si estás 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 y el protocolo Printable . Solo ciertas classs se ajustan a Printable . Cada class puede ser una cadena interpolada de alguna manera. Eso es útil cuando se escriben funciones genéricas. No tiene que limitarse a classs Printable .

Puede imprimir cualquier object utilizando la function de printing

o use \(name) para convertir cualquier object 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]" 

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) print(joinedString) 

Aquí flatMap omite los valores nil en la matriz y anexa los otros valores para dar una secuencia unida.

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

En Swift 4

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

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