Làm cách nào để chuyển đổi một mảng Swift thành một chuỗi?


353

Tôi biết cách lập trình để làm điều đó, nhưng tôi chắc chắn rằng có một cách tích hợp ...

Mỗi ngôn ngữ tôi đã sử dụng có một số loại biểu diễn văn bản mặc định cho một tập hợp các đối tượng mà nó sẽ nhổ ra khi bạn cố nối chuỗi Array bằng một chuỗi hoặc chuyển nó sang hàm print (), v.v. có cách tích hợp dễ dàng biến Mảng thành Chuỗi hay chúng ta luôn phải rõ ràng khi xâu chuỗi một mảng?


3
Swift 4: array.description hoặc nếu bạn muốn một dải phân cách tùy chỉnharray.joined(separator: ",")
Jonathan Solorzano

Câu trả lời:


697

Nếu mảng chứa các chuỗi, bạn có thể sử dụng String's joinphương pháp:

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

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

Trong Swift 2 :

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

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

Điều này có thể hữu ích nếu bạn muốn sử dụng một dấu tách cụ thể (hypen, blank, dấu phẩy, v.v.).

Mặt khác, bạn có thể chỉ cần sử dụng thuộc descriptiontính, trả về một chuỗi đại diện của mảng:

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

Gợi ý: bất kỳ đối tượng thực hiện Printablegiao thức đều có thuộc descriptiontính. Nếu bạn chấp nhận giao thức đó trong các lớp / cấu trúc của riêng bạn, bạn cũng làm cho chúng được in thân thiện

Trong Swift 3

  • jointrở thành joined, ví dụ[nil, "1", "2"].flatMap({$0}).joined()
  • joinWithSeparatortrở thành joined(separator:)(chỉ có sẵn cho Array of String)

Trong Swift 4

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

2
@Andrej: Nó hoạt động trên cả 1.2 và 2.0. Bạn đang sử dụng một chuỗi các chuỗi?
Antonio

1
Antonio, xin lỗi, xấu của tôi. Tôi đã có một vấn đề với mảng của tôi. Bây giờ tôi có thể xác nhận giải pháp của bạn hoạt động. :)
Andrej

12
"-".join(array)không còn có sẵn trong Swift 2, Xcode 7 Beta 6, hãy thử sử dụngarray.joinWithSeparator("-")
Harry Ng

87
joinWithSeparatorchỉ có sẵn cho mảng chuỗi. Nếu bạn có mảng các đối tượng khác, thì hãy sử dụng maptrước. Ví dụ:[1, 2, 3].map({"\($0)"}).joinWithSeparator(",")
Dmitry

3
@Dmitry Đừng sử dụng soley nội suy chuỗi để chuyển đổi thành chuỗi. Sẽ tốt hơn nhiều khi sử dụng trình khởi tạo trên Chuỗi
Alexander - Phục hồi Monica

130

Với Swift 5, theo nhu cầu của bạn, bạn có thể chọn một trong các mã mẫu Sân chơi sau đây để giải quyết vấn đề của mình.


Biến một mảng Characters thành a Stringkhông có dấu phân cách:

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

print(string)
// prints "John"

Biến một mảng Strings thành a Stringkhông có dấu phân cách:

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

print(string) // prints: "BobDanBryan"

Biến một mảng Strings thành a Stringbằng dấu phân cách giữa các từ:

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

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

Biến một mảng Strings thành a Stringbằng dấu phân cách giữa các ký tự:

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"

Biến một mảng Floats thành a Stringbằng dấu phân cách giữa các số:

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"

Tôi có một chuỗi trông giống như: "[1,2,3]". Có cách nào để dễ dàng chuyển đổi nó thành một mảng [Int] không? dễ dàng tức là sự đảo ngược của những gì. mô tả không?
dùng2363025

@ user2363025 uni có thể sử dụng bộ giải mã JSON. try JSONDecoder().decode([Int].self, from: Data(string.utf8))
Leo Dabus

48

Swift 2.0 Xcode 7.0 beta 6 trở đi sử dụng joinWithSeparator()thay vì join():

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

joinWithSeparator được định nghĩa là một phần mở rộng trên 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

Swift 3

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

1
Tôi sẽ nói rằng đó là ["Tôi yêu", "Swift"]. Đã tham gia (dấu phân cách: "")
Loebre

15

Trong Swift 4

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

array.joined(separator: " ")

11

Vì không ai đề cập đến giảm, nên đây là:

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

Theo tinh thần lập trình chức năng


3
Cách thức hoạt động tốt, cảm ơn ... thêm một dòng lệnh ngắn hơn : [0,1,1,0].map{"\($0)"}.reduce("",+). 😉
XLE_22

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

8

Để thay đổi một chuỗi các chuỗi tùy chọn / không tùy chọn

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

Ở đây FlatMap , compactMap bỏ qua các giá trị nil trong mảng và nối các giá trị khác để đưa ra một chuỗi tham gia.


3
@YashBedi Trong Swift 4, chúng tôi sử dụng compactMap thay vì FlatMap
Agent Smith

"$" nghĩa là gì?
Augusto

2
@Augusto Swift tự động cung cấp các tên đối số tốc ký cho các bao đóng nội tuyến, có thể được sử dụng để chỉ các giá trị của các đối số của bao đóng bởi các tên $ 0, $ 1, $ 2. Ở đây, $ 0 đề cập đến các đối số Chuỗi đầu tiên của bao đóng.
Đặc vụ Smith

4

Của tôi hoạt động trên NSMutableArray với các thành phầnJoinedByString

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

4

Trong Swift 2.2, bạn có thể phải truyền mảng của mình sang NSArray để sử dụng các thành phầnJoinedByString (",")

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

Nhân tiện, đây chỉ là một bản dịch của object-c trong swift.
Muhammad Zeeshan

3

Nếu bạn muốn bỏ các chuỗi trống trong mảng.

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

Nếu bạn cũng muốn lọc các giá trị nil:

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

1
rất thanh lịch, cảm ơn bạn :)
CheshireKat

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

Kết quả sẽ là >>> Mani Singh Nhà phát triển iOS


1

Swift tương đương với những gì bạn mô tả là nội suy chuỗi. Nếu bạn đang nghĩ về những thứ như JavaScript đang làm "x" + array, thì tương đương trong Swift là "x\(array)".

Như một lưu ý chung, có một sự khác biệt quan trọng giữa phép nội suy chuỗi so với Printablegiao thức. Chỉ một số lớp nhất định phù hợp với Printable. Mỗi lớp có thể được nội suy chuỗi bằng cách nào đó. Điều đó hữu ích khi viết các hàm chung. Bạn không phải giới hạn bản thân trong Printablecác lớp học.


1

Bạn có thể in bất kỳ đối tượng nào bằng chức năng in

hoặc sử dụng \(name)để chuyển đổi bất kỳ đối tượng thành một chuỗi.

Thí dụ:

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

Tạo phần mở rộng cho một 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

Một dấu phân cách có thể là một ý tưởng tồi cho một số ngôn ngữ như tiếng Do Thái hoặc tiếng Nhật. Thử cái này:

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

Đối với các loại dữ liệu khác tương ứng:

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

nếu bạn có danh sách mảng chuỗi, sau đó chuyển đổi sang Int

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

nó sẽ cung cấp cho bạn giá trị chuỗi


0

cho bất kỳ loại phần tử

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

Thử cái này:

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

CHO NỀN TẢNG 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

Nếu bạn đặt câu hỏi giống như thế này: tobeFormattedString = ["a", "b", "c"] Output = "abc"

String(tobeFormattedString)


Không, điều này không hoạt động. Stringkhông có trình khởi tạo có khả năng làm điều đó. Bạn đang sử dụng tiện ích mở rộng tùy chỉnh hoặc thư viện của bên thứ ba hoặc đơn giản là bạn đã nhầm lẫn.
Eric Aya
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.