Swift String to Array

时间:2015-08-22 11:06:53

标签: swift

我在Swift中有一个字符串,如下所示:

["174580798","151240033","69753978","122754394","72373738","183135789","178841809","84104360","122823486","184553211","182415131","70707972"]

我需要将其转换为NSArray。

我已经查看了SO上的其他方法,但它将每个字符分成单独的数组元素,而不是打破逗号。请参阅:Convert Swift string to array

我试过使用map()函数,我也尝试了各种类型的转换,但似乎没有什么可以接近。

提前致谢。

4 个答案:

答案 0 :(得分:5)

它可能是一个JSON字符串,所以你可以尝试这个

let string = "[\"174580798\",\"151240033\",\"69753978\",\"122754394\",\"72373738\",\"183135789\",\"178841809\",\"84104360\",\"122823486\",\"184553211\",\"182415131\",\"70707972\"]"
let data = string.dataUsingEncoding(NSUTF8StringEncoding)!
let jsonArray = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions(), error: nil) as! [String]

因为类型[String]是不同的,你可以强迫它

Swift 3 +:

let data = Data(string.utf8)
let jsonArray = try! JSONSerialization.jsonObject(with: data) as! [String]

答案 1 :(得分:2)

另外两个答案正在发挥作用,尽管SwiftStudiers在性能上并不是最好的。 vadian是正确的,你的字符串很可能是JSON。在这里,我提出了另一种不涉及JSON解析的方法和一种非常快的方法:

import Foundation

let myString = "[\"174580798\",\"151240033\",\"69753978\",\"122754394\",\"72373738\",\"183135789\",\"178841809\",\"84104360\",\"122823486\",\"184553211\",\"182415131\",\"70707972\"]"

func toArray(var string: String) -> [String] {
    string.removeRange(string.startIndex ..< advance(string.startIndex, 2)) // Remove first 2 chars
    string.removeRange(advance(string.endIndex, -2) ..< string.endIndex)    // Remote last 2 chars
    return string.componentsSeparatedByString("\",\"")
}

toArray(myString)    // ["174580798", "151240033", "69753978", ...

你可能想要这些数字,你可以在Swift 2.0中做到这一点:

toArray(myString).flatMap{ Int($0) }    // [174'580'798, 151'240'033, 69'753'978, ...

返回Int s

的数组

编辑:对于那些喜欢不变性和函数式编程的人来说,有这个解决方案:

func toArray(string: String) -> [String] {
    return string[advance(string.startIndex, 2) ..< advance(string.endIndex, -2)]
        .componentsSeparatedByString("\",\"")
}

或者这个:

func toArray(string: String) -> [Int] {
    return string[advance(string.startIndex, 2) ..< advance(string.endIndex, -2)]
        .componentsSeparatedByString("\",\"")
        .flatMap{ Int($0) }
}

答案 2 :(得分:1)

试试这个。我刚添加了我的函数,删除了除数字之外的字符串中的任何符号。在您的案例

中删除"[]会有所帮助
var myString = "[\"174580798\",\"151240033\",\"69753978\",\"122754394\",\"72373738\",\"183135789\",\"178841809\",\"84104360\",\"122823486\",\"184553211\",\"182415131\",\"70707972\"]"


        var s=myString.componentsSeparatedByString("\",\"")

        var someArray: [String] = []

        for i in s {
            someArray.append(deleteAllExceptNumbers(i))
        }
        println(someArray[0]);


func deleteAllExceptNumbers(str:String) -> String {
        var rez=""
        let digits = NSCharacterSet.decimalDigitCharacterSet()
        for tempChar in str.unicodeScalars {
            if digits.longCharacterIsMember(tempChar.value) {
                rez += tempChar.description
            }
        }
        return rez.stringByReplacingOccurrencesOfString("\u{22}", withString: "")
    }

答案 3 :(得分:1)

Swift 1.2:

如果有人建议你想要返回一个Int数组,你可以通过这个简洁的行从myString获取它:

var myArrayOfInt2 = myString.componentsSeparatedByString("\"").map{$0.toInt()}.filter{$0 != nil}.map{$0!}

在Swift 2(Xcode 7.0 beta 5)中:

var myArrayOfInt = myString.componentsSeparatedByString("\"").map{Int($0)}.filter{$0 != nil}.map{$0!}

这是有效的,因为强制转换会返回一个可选的nil,其中强制转换失败 - 例如使用[],。因此,似乎不需要其他代码来删除这些字符。

编辑:正如Kametrixom在下面评论过的 - 可以使用.flatMap在Swift 2中进一步简化,如下所示:

var myArrayOfInt = myString.componentsSeparatedByString("\"").flatMap{ Int($0) }

另外 - 并单独:

参考Vadian的优秀答案。在Swift 2中,这将成为:

// ...

do {
    let jsonArray = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions()) as! [String]
} catch {
    _ = error // or do something with the error
}