Bagaimana cara mengubah Swift Array ke String?

353

Saya tahu cara pemrograman melakukannya, tapi saya yakin ada cara bawaan ...

Setiap bahasa yang saya gunakan memiliki semacam representasi tekstual default untuk koleksi objek yang akan dimuntahkan ketika Anda mencoba menggabungkan Array dengan string, atau meneruskannya ke fungsi print (), dll. Apakah bahasa Swift Apple memiliki cara bawaan untuk dengan mudah mengubah Array menjadi String, atau apakah kita harus selalu eksplisit saat meringkas array?

Troy
sumber
3
Swift 4: array.description atau jika Anda menginginkan pemisah khususarray.joined(separator: ",")
Jonathan Solorzano

Jawaban:

697

Jika array berisi string, Anda dapat menggunakan metode String's join:

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

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

Dalam Swift 2 :

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

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

Ini bisa berguna jika Anda ingin menggunakan pemisah tertentu (hip, kosong, koma, dll).

Kalau tidak, Anda bisa menggunakan descriptionproperti, yang mengembalikan representasi string dari array:

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

Petunjuk: objek apa pun yang mengimplementasikan Printableprotokol memiliki descriptionproperti. Jika Anda mengadopsi protokol itu di kelas / struct Anda sendiri, Anda membuatnya ramah cetak

Dalam Swift 3

  • joinmenjadi joined, misalnya[nil, "1", "2"].flatMap({$0}).joined()
  • joinWithSeparatormenjadi joined(separator:)(hanya tersedia untuk Array of Strings)

Dalam Swift 4

var array = ["1", "2", "3"]
array.joined(separator:"-")
Antonio
sumber
2
@Andrej: Ini berfungsi pada 1.2 dan 2.0. Apakah Anda menggunakan array string?
Antonio
1
Antonio, maaf, salahku. Saya punya masalah dengan array saya. Sekarang saya dapat mengkonfirmasi solusi Anda berfungsi. :)
Andrej
12
"-".join(array)tidak lagi tersedia di Swift 2, Xcode 7 Beta 6, coba gunakanarray.joinWithSeparator("-")
Harry Ng
87
joinWithSeparatorhanya tersedia untuk berbagai string. Jika Anda memiliki larik objek lain, maka gunakan mapdulu. Misalnya,[1, 2, 3].map({"\($0)"}).joinWithSeparator(",")
Dmitry
3
@Dmitry Jangan gunakan string interpolasi tunggal untuk konversi ke string. Jauh lebih baik menggunakan inisialisasi pada String
Alexander - Reinstate Monica
130

Dengan Swift 5, sesuai dengan kebutuhan Anda, Anda dapat memilih salah satu kode contoh Playground berikut untuk menyelesaikan masalah Anda.


Mengubah array Characters menjadi Stringtanpa pemisah:

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

print(string)
// prints "John"

Mengubah array Strings menjadi Stringtanpa pemisah:

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

print(string) // prints: "BobDanBryan"

Mengubah array Strings menjadi Stringdengan pemisah antara kata-kata:

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

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

Mengubah array Strings menjadi Stringdengan pemisah antara karakter:

let stringArray = ["car", "bike", "boat"]
let characterArray = stringArray.flatMap { $0 }
let stringArray2 = characterArray.map { String($0) }
let string = stringArray2.joined(separator: ", ")

print(string) // prints: "c, a, r, b, i, k, e, b, o, a, t"

Mengubah array Floats menjadi Stringdengan pemisah antara angka:

let floatArray = [12, 14.6, 35]
let stringArray = floatArray.map { String($0) }
let string = stringArray.joined(separator: "-")

print(string)
// prints "12.0-14.6-35.0"
Imanou Petit
sumber
Saya memiliki string yang terlihat seperti: "[1,2,3]". Apakah ada cara untuk dengan mudah mengkonversi ini ke array [Int]? mudah yaitu kebalikan dari apa. Deskripsi tidak?
user2363025
@ user2363025 uni dapat menggunakan dekoder JSON. try JSONDecoder().decode([Int].self, from: Data(string.utf8))
Leo Dabus
48

Swift 2.0 Xcode 7.0 beta 6 dan seterusnya menggunakan joinWithSeparator()alih-alih join():

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

joinWithSeparator didefinisikan sebagai ekstensi aktif 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
}
Siva
sumber
23

Cepat 3

["I Love","Swift"].joined(separator:" ") // previously joinWithSeparator(" ")
hardikdevios
sumber
1
Saya akan mengatakan bahwa itu adalah ["I Love", "Swift"] bergabung (separator: "")
Loebre
15

Dalam Swift 4

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

array.joined(separator: " ")
Ankit garg
sumber
11

Karena tidak ada yang menyebutkan pengurangan, ini dia:

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

Dalam semangat pemrograman fungsional 🤖

eonist
sumber
3
Cara yang baik untuk melakukan hal-hal, terima kasih ... menambahkan akhir yang lebih pendek dari baris perintah: [0,1,1,0].map{"\($0)"}.reduce("",+). 😉
XLE_22
@ XLE_22[0,1,1,0].map(String.init).joined()
Leo Dabus
8

Untuk mengubah array String Opsional / Non-Opsional

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

Di sini flatMap , compactMap melompati nilai nil dalam array dan menambahkan nilai-nilai lain untuk memberikan string yang digabungkan.

Agen Smith
sumber
3
@YashBedi Di Swift 4 kami menggunakan compactMap, bukan flatMap
Agen Smith
apa arti dari "$"?
Augusto
2
@Augusto Swift secara otomatis menyediakan nama argumen steno untuk inline closure, yang dapat digunakan untuk merujuk pada nilai argumen penutupan dengan nama $ 0, $ 1, $ 2. Di sini, $ 0 merujuk pada argumen String pertama penutupan.
Agen Smith
4

Milik saya bekerja pada NSMutableArray dengan componentsJoinedByString

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

Di Swift 2.2 Anda mungkin harus membuang array ke NSArray untuk menggunakan componentsJoinedByString (",")

let stringWithCommas = (yourArray as NSArray).componentsJoinedByString(",")
Carlos Perez Perez
sumber
Ngomong-ngomong, ini hanyalah terjemahan dari objektif-c yang cepat.
Muhammad Zeeshan
3

Jika Anda ingin membuang string kosong dalam array.

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

Jika Anda ingin memfilter nilai nil juga:

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

Hasilnya adalah >>> Pengembang iOS Mani Singh

Maninderjit Singh
sumber
1

Swift setara dengan apa yang Anda gambarkan adalah interpolasi string. Jika Anda memikirkan hal-hal seperti yang dilakukan JavaScript "x" + array, padanan dalam Swift adalah "x\(array)".

Sebagai catatan umum, ada perbedaan penting antara interpolasi string vs Printableprotokol. Hanya kelas tertentu yang sesuai Printable. Setiap kelas dapat diinterpolasi dengan cara apapun. Itu membantu ketika menulis fungsi generik. Anda tidak harus membatasi diri di Printablekelas.

Rob Napier
sumber
1

Anda dapat mencetak objek apa pun menggunakan fungsi cetak

atau gunakan \(name)untuk mengonversi objek apa pun menjadi string.

Contoh:

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

Buat ekstensi untuk 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
        }
    }
}
Bartłomiej Semańczyk
sumber
0

Pemisah bisa menjadi ide yang buruk untuk beberapa bahasa seperti bahasa Ibrani atau Jepang. Coba ini:

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

Untuk tipe data lainnya masing-masing:

// 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!)
Alexey Chekanov
sumber
0

jika Anda memiliki daftar larik string, lalu konversikan ke Int

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

itu akan memberi Anda nilai string

Oshitha Wimalasuriya
sumber
0

untuk semua jenis Elemen

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;
    }
}
john07
sumber
0

Coba ini:

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: ",")
Tej Patel
sumber
-1

UNTUK 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
    }
}
Ty Daniels
sumber
-1

Jika pertanyaan Anda adalah sesuatu seperti ini: tobeFormattedString = ["a", "b", "c"] Output = "abc"

String(tobeFormattedString)

dheeru
sumber
Tidak, ini tidak berhasil. Stringtidak memiliki penginisialisasi yang mampu melakukan itu. Entah Anda menggunakan ekstensi khusus atau perpustakaan pihak ketiga, atau Anda jelas-jelas salah.
Eric Aya