Swift Dizisini bir Dizeye nasıl dönüştürebilirim?


354

Programlı olarak nasıl yapacağımı biliyorum, ama eminim yerleşik bir yol var ...

Kullandığım her dilde, Diziyi bir dizeyle birleştirmeye veya bir print () işlevine vb. Aktarmaya çalıştığınızda tüküreceği bir nesne koleksiyonu için bir çeşit varsayılan metin temsili vardır. Apple'ın Swift dili Diziyi kolayca bir Dizeye dönüştürmek için yerleşik bir yolunuz var mı yoksa bir diziyi dizilerken her zaman açık olmamız mı gerekiyor?


3
Swift 4: array.description Veya özel bir ayırıcı istiyorsanızarray.joined(separator: ",")
Jonathan Solorzano

Yanıtlar:


701

Dizi dizeler içeriyorsa, String's joinyöntemini kullanabilirsiniz:

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

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

In Swift 2 :

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

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

Belirli bir ayırıcı (hiper, boşluk, virgül, vb.) Kullanmak istiyorsanız bu yararlı olabilir.

Aksi takdirde description, dizinin dize olarak temsilini döndüren özelliği kullanabilirsiniz :

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

İpucu: Printableprotokolü uygulayan herhangi bir nesnenin bir descriptionözelliği vardır. Bu protokolü kendi sınıflarınızda / yapılarınızda benimserseniz, onları da yazdırma dostu yaparsınız

Gelen Swift 3

  • joinjoinedörnek olur[nil, "1", "2"].flatMap({$0}).joined()
  • joinWithSeparatorolur joined(separator:)(yalnızca Dizeler Dizisi için kullanılabilir)

In Swift 4

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

2
@Andrej: Hem 1.2 hem de 2.0 üzerinde çalışıyor. Bir dizi dizgi mi kullanıyorsunuz?
Antonio

1
Antonio, üzgünüm, benim hatam. Dizimle ilgili bir sorunum vardı. Şimdi çözüm çalışmalarınızı doğrulayabilirim. :)
Andrej

12
"-".join(array)artık Swift 2, Xcode 7 Beta 6'da mevcut değil, kullanmayı deneyinarray.joinWithSeparator("-")
Harry Ng

87
joinWithSeparatoryalnızca dizeler dizisi için kullanılabilir. Başka nesnelerin dizisi varsa, önce kullanın map. Örneğin,[1, 2, 3].map({"\($0)"}).joinWithSeparator(",")
Dmitry

3
@Dmitry Dizeye dönüştürmek için dize enterpolasyonu tabanını kullanmayın. String
Alexander - Reinstate Monica'da

130

Swift 5 ile, ihtiyaçlarınıza göre, sorununuzu çözmek için aşağıdaki Playground örnek kodlarından birini seçebilirsiniz.


Ayırıcı olmadan Characters dizisini a'ya dönüştürme String:

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

print(string)
// prints "John"

Ayırıcı olmadan Strings dizisini a'ya dönüştürme String:

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

print(string) // prints: "BobDanBryan"

Kelimeler arasında bir ayırıcı ile bir Strings dizisini a dönüştürmek String:

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

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

StringS dizisini Stringkarakterler arasında ayırıcı ile a'ya dönüştürme :

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"

Bir Floats dizisini Stringsayılar arasında ayırıcıyla a'ya dönüştürme :

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"

"[1,2,3]" gibi görünen bir dize var. Bunu kolayca bir [Int] dizisine dönüştürmenin herhangi bir yolu var mı? kolayca yani .description tersini yapar?
user2363025

@ user2363025 uni JSON dekoderini kullanabilir. try JSONDecoder().decode([Int].self, from: Data(string.utf8))
Leo Dabus

48

Swift 2.0 Xcode 7.0 beta 6 itibaren kullanır joinWithSeparator()yerine join():

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

joinWithSeparator , üzerindeki bir uzantı olarak tanımlandı 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

Hızlı 3

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

1
Bunun "" Seviyorum "," Swift "olduğunu söyleyebilirim. Katıldı (ayırıcı:" ")
Loebre

15

Swift 4'te

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

array.joined(separator: " ")

11

Hiç kimse azaltma sözü vermediğinden, burada:

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

Fonksiyonel programlama ruhuyla 🤖


3
Komut satırından daha kısa ucunu ekleyerek şeyler sayesinde yapmanın güzel yolu ...: [0,1,1,0].map{"\($0)"}.reduce("",+). 😉
XLE_22

@ XLE_22[0,1,1,0].map(String.init).joined()
Leo Dabus

8

İsteğe Bağlı / İsteğe Bağlı Olmayan Dizeler dizisini değiştirmek için

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

Burada flatMap , compactMap dizideki nil değerlerini atlar ve birleştirilmiş dize vermek için diğer değerleri ekler.


3
@YashBedi Swift 4'te flatMap yerine compactMap kullanıyoruz
Ajan Smith

"$" ne anlama geliyor?
Augusto

2
@Augusto Swift, satır içi kapanışlara otomatik olarak steno argüman adları sağlar; bu, kapanış argümanlarının değerlerini $ 0, $ 1, $ 2 adlarıyla ifade etmek için kullanılabilir. Burada $ 0, kapanışın ilk String argümanlarına atıfta bulunur.
Ajan Smith

4

Mine, bileşenleri ile NSMutableArray üzerinde çalışıyor

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

4

Swift 2.2'de componentsJoinedByString (",") kullanmak için dizinizi NSArray'e yayınlamanız gerekebilir

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

Bu arada, bu sadece objektif-c'nin hızlı bir çevirisidir.
Muhammed Zeeshan

3

Dizideki boş dizeleri çıkarmak istiyorsanız.

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

Nil değerlerini de filtrelemek istiyorsanız:

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

2
let arrayTemp :[String] = ["Mani","Singh","iOS Developer"]
    let stringAfterCombining = arrayTemp.componentsJoinedByString(" ")
   print("Result will be >>>  \(stringAfterCombining)")

Sonuç >>> Mani Singh iOS Geliştirici


1

Tanımladığınız Swift'e eşdeğer dize enterpolasyonudur. JavaScript'in yaptığı gibi şeyleri düşünüyorsanız "x" + array, Swift'teki eşdeğer"x\(array)" .

Genel bir not olarak, Printableprotokol ile dize enterpolasyonu arasında önemli bir fark vardır . Sadece belirli sınıflar uygundur Printable. Her sınıf bir şekilde dize enterpolasyonlu olabilir. Genel işlevler yazarken faydalıdır. Kendinizi Printablesınıflarla sınırlamanız gerekmez .


1

Yazdırma işlevini kullanarak herhangi bir nesneyi yazdırabilirsiniz

veya \(name)herhangi bir nesneyi bir dizeye dönüştürmek için kullanın .

Misal:

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

Şunun için uzantı oluştur 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

Bir ayırıcı İbranice veya Japonca gibi bazı diller için kötü bir fikir olabilir. Bunu dene:

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

Sırasıyla diğer veri türleri için:

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

dize dizi listeniz varsa, Int'ye dönüştürün

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

size dize değeri verecektir


0

herhangi bir Eleman türü için

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

Bunu dene:

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

SWIFT 3 İÇİN:

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

Sorunuz şöyle bir şeyse: tobeFormattedString = ["a", "b", "c"] Çıktı = "abc"

String(tobeFormattedString)


Hayır, bu işe yaramıyor. Stringbunu başlatabilecek bir başlatıcısı yok. Özel bir uzantı veya üçüncü taraf kitaplığı kullanıyorsunuz veya basitçe yanılıyorsunuz.
Eric Aya
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.