如何将Swift数组转换为字符串?

时间:2014-09-13 19:48:09

标签: ios arrays swift

我知道如何以编程方式执行此操作,但我确信这是一种内置方式...

我尝试使用的每种语言都有某种对象集合的默认文本表示形式,当您尝试将数组与字符串连接起来或将其传递给print()函数等时,它会吐出来。 Apple的Swift语言是否有内置的方法可以轻松地将数组转换为字符串,或者在对字符串进行字符串化时是否总是必须明确?

24 个答案:

答案 0 :(得分:612)

如果数组包含字符串,您可以使用String' join方法:

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

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

Swift 2

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

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

如果您想使用特定的分隔符(hypen,blank,逗号等),这可能很有用。

否则,您只需使用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:)(仅适用于字符串数组)

Swift 4

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

答案 1 :(得分:106)

使用Swift 5,根据您的需要,您可以选择以下Playground示例代码之一来解决您的问题。

Character的数组转换为没有分隔符的String

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

print(string)
// prints "John"

String的数组转换为没有分隔符的String

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

print(string) // prints: "BobDanBryan"

String的数组转换为String,并在单词之间设置分隔符:

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

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

String的数组转换为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"

Float的数组转换为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"

答案 2 :(得分:49)

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
}

答案 3 :(得分:23)

Swift 3

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

答案 4 :(得分:14)

在Swift 4中

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

array.joined(separator: " ")

答案 5 :(得分:7)

更改可选/非可选字符串数组

//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 会跳过数组中的nil值,并附加其他值以提供连接字符串。

答案 6 :(得分:6)

由于没有人提到减少,这里是:

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

本着函数式编程的精神

答案 7 :(得分:4)

Mine可以在NSMutableArray上使用componentsJoinedByString

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

答案 8 :(得分:3)

在Swift 2.2中,您可能必须将数组转换为NSArray以使用componentsJoinedByString(",")

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

答案 9 :(得分:2)

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

结果将是>>> Mani Singh iOS开发人员

答案 10 :(得分:2)

如果你想在数组中抛弃空字符串。

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

如果你想过滤nil值:

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

答案 11 :(得分:1)

Swift等同于你所描述的是字符串插值。如果你正在考虑像"x" + array这样的JavaScript,那么Swift中的等价物就是"x\(array)"

总的来说,字符串插值与Printable协议之间存在重要差异。只有某些类符合Printable每个类都可以以某种方式进行字符串插值。在编写泛型函数时,这很有帮助。您不必将自己限制在Printable课程。

答案 12 :(得分:1)

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); createDatabase(); c = db.rawQuery(fetch,null); c.moveToFirst(); while(c.moveToNext()){ id = c.getString(c.getColumnIndex("_id")); name = c.getString(c.getColumnIndex("name")); number = c.getString(c.getColumnIndex("number")); //Toast.makeText(Main2Activity.this,id + name,Toast.LENGTH_LONG).show(); from = new String[]{id, name, number}; to = new int[]{R.id.label, R.id.numberq, R.id.num}; adapter = new SimpleCursorAdapter(this,R.layout.layout,c,from,to,0); } ListView list = (ListView) findViewById(R.id.listview); list.setAdapter(adapter); } protected void createDatabase(){ db = openOrCreateDatabase("PersonDB",Context.MODE_PRIVATE,null); db.execSQL("CREATE TABLE IF NOT EXISTS Person(_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name VARCHAR, number VARCHAR);"); }

创建扩展程序
Array

答案 13 :(得分:0)

您可以使用打印功能

打印任何对象

或使用\(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]"

答案 14 :(得分: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!)

答案 15 :(得分:0)

如果您有字符串数组列表,则转换为Int

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

它将为您提供字符串值

答案 16 :(得分: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;
    }
}

答案 17 :(得分: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: ",")

答案 18 :(得分:0)

要将结构类型列表转换为字符串时使用

struct MyStruct {
  var name : String
  var content : String
}

let myStructList = [MyStruct(name: "name1" , content: "content1") , MyStruct(name: "name2" , content: "content2")]

以这种方式隐藏您的数组

let myString = myStructList.map({$0.name}).joined(separator: ",")

将产生===> "name1,name2"

答案 19 :(得分:0)

如今,在iOS 13及更高版本和macOS 10.15及更高版本中,我们可能会使用ListFormatter

let formatter = ListFormatter()

let names = ["Moe", "Larry", "Curly"]
if let string = formatter.string(from: names) {
    print(string)
}

这将产生一个很好的,自然的列表字符串表示形式。美国用户将看到:

萌,拉里和卷曲

它将支持(a)您的应用已本地化的任何语言; (b)用户设备已配置。例如,如果某个德国用户使用支持德语本地化的应用,则会看到:

Moe,Larry und Curly

答案 20 :(得分:0)

当您也有结构数组时,您可以使用 fatal: repository 'https://git-codecommit.us-west-2.amazonaws.com/v1/repos/myrepo/' not found 来获取单个 String

joined()

您可以使用 struct Person{ let name:String let contact:String } & map()

轻松生成字符串
joined()

输出:

PersonList.map({"\($0.name) - \($0.contact)"}).joined(separator: " | ")

答案 21 :(得分:-1)

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

答案 22 :(得分:-1)

如果你的问题是这样的: tobeFormattedString = [“a”,“b”,“c”] 输出=“abc”

1.139185909 55190 1.39 1.4 1703 10.5 11.0 58805 5.2 5.3 1.139782182 18567 2.22 2.32 62683 3.8 3.9 58805 3.2 3.5

答案 23 :(得分:-2)

我认为将数组转换为字符串的更好方法是像“(stringArray!)”下面一样直接分配为字符串