it-roy-ru.com

Как преобразовать массив Swift в строку?

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

Каждый язык, который я использовал, имеет своего рода текстовое представление по умолчанию для коллекции объектов, которое он будет выдавать, когда вы попытаетесь объединить массив со строкой или передать его функции print () и т.д. Поддерживает ли язык Apple Swift есть встроенный способ легко превратить массив в строку, или мы всегда должны быть явными при строковом массиве?

292
Troy

Если массив содержит строки, вы можете использовать метод String's join:

var array = ["1", "2", "3"]

let stringRepresentation = "-".join(array) // "1-2-3"

В Swift 2 :

var array = ["1", "2", "3"]

let stringRepresentation = array.joinWithSeparator("-") // "1-2-3"

Это может быть полезно, если вы хотите использовать определенный разделитель (Hypen, пробел, запятая и т.д.).

В противном случае вы можете просто использовать свойство description, которое возвращает строковое представление массива:

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

Подсказка: любой объект, реализующий протокол Printable, имеет свойство description. Если вы применяете этот протокол в своих собственных классах/структурах, вы также делаете их удобными для печати

В Swift 3  

  • join становится joined, пример [nil, "1", "2"].flatMap({$0}).joined()
  • joinWithSeparator становится joined(separator:) (доступно только для Array of Strings)

В Swift 4

var array = ["1", "2", "3"]
array.joined(separator:"-")
577
Antonio

С Swift 3, в соответствии с вашими потребностями, вы можете выбрать один из следующих блоков кода.


Превращение массива Character в String без разделителя:

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

print(string)
// prints "John"

Превращение массива String в String без разделителя:

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"

Превращение массива String в String с разделителем между словами:

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

print(string)
// prints "Bob Dan Bryan"

Превращение массива String в String с разделителем между символами:

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"

Превращение массива Float в String с разделителем между числами:

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"
103
Imanou Petit

Swift 2.0 Xcode 7.0 beta 6 и выше использует joinWithSeparator() вместо join():

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

joinWithSeparator определяется как расширение 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
}
48
Siva

Swift 3  

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

В Swift 4

let array:[String] = ["Apple", "Pear ","Orange"]

array.joined(separator: " ")
14
Ankit garg

Чтобы изменить массив необязательных/необязательных строк

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

Здесь flatMap , compactMap пропускает значения nil в массиве и добавляет другие значения, чтобы получить объединенную строку.

7
Agent Smith

Поскольку никто не упомянул снижение, вот оно:

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

В духе функционального программирования ????

6
eonist

Мой работает на NSMutableArray с компонентами JoinedByString

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

В Swift 2.2 вам может потребоваться привести ваш массив к NSArray, чтобы использовать componentJoinedByString (",")

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

Если вы хотите отбросить пустые строки в массиве.

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

Если вы также хотите отфильтровать nil-значения:

["Jet", nil, "", "Fire"].flatMap { $0 }.filter { !$0.isEmpty }.joined(separator: "-")
2
Sourav Chandra
let arrayTemp :[String] = ["Mani","Singh","iOS Developer"]
    let stringAfterCombining = arrayTemp.componentsJoinedByString(" ")
   print("Result will be >>>  \(stringAfterCombining)")

Результат будет >>> Mani Singh iOS Developer

2
Maninderjit Singh

Свифт, эквивалентный тому, что вы описываете - это интерполяция строк. Если вы думаете о таких вещах, как JavaScript, выполняющий "x" + array, эквивалент в Swift это "x\(array)".

Как общее замечание, между интерполяцией строк и протоколом Printable есть важное отличие. Только определенные классы соответствуют Printable. Каждый класс может быть каким-либо образом интерполирован. Это полезно при написании общих функций. Вам не нужно ограничивать себя Printable классами.

1
Rob Napier

Создать расширение для 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
        }
    }
}
1
Bartłomiej Semańczyk

Попробуй это:

let categories = dictData?.value(forKeyPath: "listing_subcategories_id") as! NSMutableArray
                        let tempArray = NSMutableArray()
                        for dc in categories
                        {
                            let dictD = dc as? NSMutableDictionary
                            tempArray.add(dictD?.object(forKey: "subcategories_name") as! String)
                        }
                        let joinedString = tempArray.componentsJoined(by: ",")
0
Tej Patel

для любого типа элемента

extension Array {

    func joined(glue:()->Element)->[Element]{
        var result:[Element] = [];
        result.reserveCapacity(count * 2);
        let last = count - 1;
        for (ix,item) in enumerated() {
            result.append(item);
            guard ix < last else{ continue }
            result.append(glue());
        }
        return result;
    }
}
0
john07

если у вас есть список строковых массивов, то конвертируйте в Int 

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

это даст вам строковое значение 

0
Oshitha Wimalasuriya

Вы можете распечатать любой объект, используя функцию печати

или используйте \(name) для преобразования любого объекта в строку.

Пример:

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]"
0
123FLO321

Разделитель может быть плохой идеей для некоторых языков, таких как иврит или японский . Попробуйте это:

// 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!)

Для других типов данных соответственно:

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