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?


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

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"

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
}

23

Cepat 3

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

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

11

Karena tidak ada yang menyebutkan pengurangan, ini dia:

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

Dalam semangat pemrograman fungsional 🤖


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.


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"

4

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

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

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

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


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.


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

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

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

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


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

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: ",")

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

-1

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

String(tobeFormattedString)


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.