ฉันจะแปลง Swift Array เป็น String ได้อย่างไร


353

ฉันรู้ว่าจะทำอย่างไรโดยทางโปรแกรม แต่ฉันแน่ใจว่ามีวิธีการในตัว ...

ทุกภาษาที่ฉันใช้มีการแสดงข้อความเริ่มต้นบางอย่างสำหรับคอลเลกชันของวัตถุที่มันจะคายออกมาเมื่อคุณพยายามเชื่อมอาเรย์กับสตริงหรือส่งต่อไปยังฟังก์ชัน print () ฯลฯ ภาษา Swift ของ Apple มีวิธีการในการเปลี่ยน Array ให้เป็นสตริงได้ง่ายหรือไม่หรือเราจะต้องมีความชัดเจนเมื่อทำการสร้างอาร์เรย์


3
Swift 4: array.descriptionหรือถ้าคุณต้องการตัวคั่นแบบกำหนดเองarray.joined(separator: ",")
Jonathan Solorzano

คำตอบ:


697

ถ้าอาร์เรย์ประกอบด้วยสตริง, คุณสามารถใช้String's joinวิธีการ:

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

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

ในสวิฟต์ 2 :

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

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

สิ่งนี้มีประโยชน์หากคุณต้องการใช้ตัวคั่นเฉพาะ (hypen, blank, comma, etc)

มิฉะนั้นคุณสามารถใช้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:"-")

2
@Andrej: มันทำงานได้ทั้ง 1.2 และ 2.0 คุณใช้อาร์เรย์ของสตริงหรือไม่?
อันโตนิโอ

1
อันโตนิโอขอโทษฉันไม่ดี ฉันมีปัญหากับอาเรย์ของฉัน ตอนนี้ฉันสามารถยืนยันการแก้ปัญหาของคุณได้ :)
Andrej

12
"-".join(array)ไม่สามารถใช้งานได้ใน Swift 2, Xcode 7 Beta 6 ลองใช้array.joinWithSeparator("-")
Harry Ng

87
joinWithSeparatorใช้ได้เฉพาะอาร์เรย์ของสตริงเท่านั้น หากคุณมีอาร์เรย์ของวัตถุอื่น ๆ ให้ใช้mapก่อน ตัวอย่างเช่น[1, 2, 3].map({"\($0)"}).joinWithSeparator(",")
Dmitry

3
@Dmitry อย่าใช้การแก้ไขสตริงในการแปลงเป็นสตริง มันดีกว่าการใช้ initializer บน String
Alexander - Reinstate Monica

130

ด้วย Swift 5 ตามความต้องการของคุณคุณสามารถเลือกหนึ่งในตัวอย่างรหัสสนามเด็กเล่นต่อไปนี้เพื่อแก้ไขปัญหาของคุณ


เปลี่ยนอาร์เรย์ของCharacters เป็น a Stringโดยไม่มีตัวคั่น:

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

print(string)
// prints "John"

เปลี่ยนอาร์เรย์ของStrings เป็น a Stringโดยไม่มีตัวคั่น:

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

print(string) // prints: "BobDanBryan"

เปลี่ยนอาร์เรย์ของStrings เป็น a Stringด้วยตัวคั่นระหว่างคำ:

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

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

เปลี่ยนอาร์เรย์ของStrings เป็น a Stringด้วยตัวคั่นระหว่างอักขระ:

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"

เปลี่ยนอาร์เรย์ของFloats เป็น a Stringด้วยตัวคั่นระหว่างตัวเลข:

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]" มีวิธีใดที่จะแปลงให้เป็นอาร์เรย์ [Int] ได้อย่างง่ายดายหรือไม่? ง่าย ๆ คือการย้อนกลับของคำอธิบายสิ่งที่ทำ
user2363025

@ user2363025 uni สามารถใช้ตัวถอดรหัส JSON try JSONDecoder().decode([Int].self, from: Data(string.utf8))
Leo Dabus

48

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
}

23

สวิฟท์ 3

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

1
ฉันจะบอกว่ามันเป็น ["I Love", "Swift"]. เข้าร่วม (ตัวคั่น: "")
Loebre


11

เนื่องจากไม่มีใครได้กล่าวถึงการลดนี่คือ:

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

ในจิตวิญญาณของการเขียนโปรแกรมการทำงาน🤖


3
วิธีที่ดีในการทำสิ่งขอบคุณ ... [0,1,1,0].map{"\($0)"}.reduce("",+)เพิ่มท้ายสั้นของบรรทัดคำสั่ง: 😉
XLE_22

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

8

หากต้องการเปลี่ยนอาเรย์ของสตริงที่ไม่จำเป็น / ไม่บังคับ

//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ข้ามค่าศูนย์ในอาร์เรย์และผนวกค่าอื่น ๆ เพื่อให้สตริงที่เข้าร่วม


3
@YashBedi ใน Swift 4 เราใช้compactMapแทนflatMap
Agent Smith

ความหมายของ "$" คืออะไร?
Augusto

2
@Augusto Swift ให้ชื่ออาร์กิวเมนต์แบบย่อไปยังการปิดแบบอินไลน์โดยอัตโนมัติซึ่งสามารถใช้เพื่ออ้างถึงค่าของการขัดแย้งของการปิดโดยชื่อ $ 0, $ 1, $ 2 ที่นี่ $ 0 อ้างถึงการโต้แย้งสตริงแรกของการปิด
ตัวแทนสมิ ธ

4

Mine ทำงานบน NSMutableArray ด้วย componentsJoinedByString

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

4

ใน Swift 2.2 คุณอาจต้องส่งอาเรย์ของคุณไปยัง NSArray เพื่อใช้งาน componentsJoinedByString (",")

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

โดยวิธีการนี้เป็นเพียงการแปลวัตถุประสงค์ -c อย่างรวดเร็ว
มูฮัมหมัดเซชาน

3

หากคุณต้องการทิ้งสตริงว่างในอาร์เรย์

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

หากคุณต้องการกรองค่าศูนย์เช่นกัน:

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

1
สง่างามมากขอบคุณ :)
CheshireKat

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

ผลลัพธ์จะเป็น >>> Mani Singh iOS Developer


1

Swift เทียบเท่ากับสิ่งที่คุณกำลังอธิบายคือการแก้ไขสตริง หากคุณกำลังคิดเกี่ยวกับสิ่งที่ชอบทำ JavaScript เทียบเท่าในสวิฟท์คือ"x" + array"x\(array)"

ตามบันทึกทั่วไปมีความแตกต่างที่สำคัญระหว่างการแก้ไขสตริงกับPrintableโปรโตคอล Printableเฉพาะชั้นเรียนบางอย่างเป็นไปตาม ทุกคลาสสามารถสอดแทรกสตริงอย่างใด มีประโยชน์เมื่อเขียนฟังก์ชันทั่วไป คุณไม่จำเป็นต้อง จำกัดPrintableชั้นเรียนเท่านั้น


1

คุณสามารถพิมพ์วัตถุใด ๆ โดยใช้ฟังก์ชั่นการพิมพ์

หรือใช้\(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]"

1

สร้างส่วนขยายสำหรับ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

ตัวคั่นอาจเป็นความคิดที่ไม่ดีสำหรับบางภาษาเช่นฮิบรูหรือญี่ปุ่น ลองสิ่งนี้:

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

หากคุณมีรายการอาร์เรย์สตริงให้แปลงเป็น Int

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

มันจะให้ค่าสตริง


0

สำหรับองค์ประกอบองค์ประกอบใด ๆ

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

ลองสิ่งนี้:

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:

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

หากคุณมีคำถามเช่นนี้: tobeFormattedString = ["a", "b", "c"] เอาต์พุต = "abc"

String(tobeFormattedString)


ไม่มันไม่ทำงาน Stringไม่มี initializer ที่สามารถทำเช่นนั้นได้ ไม่ว่าคุณจะใช้ส่วนขยายที่กำหนดเองหรือห้องสมุดบุคคลที่สามหรือคุณเข้าใจผิดอย่างชัดแจ้ง
Eric Aya
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.