Swift 快速字符串到数组

Swift 快速字符串到数组,swift,Swift,我在Swift中有一个字符串,如下所示: ["174580798","151240033","69753978","122754394","72373738","183135789","178841809","84104360","122823486","184553211","182415131","70707972"] 我需要把它变成一个垃圾堆 我已经研究了其他方法,但是它将每个字符分解成一个单独的数组元素,而不是用逗号。见: 我尝试过使用map()函数,也尝试过各种类型的强制转换,但似乎

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

["174580798","151240033","69753978","122754394","72373738","183135789","178841809","84104360","122823486","184553211","182415131","70707972"]
我需要把它变成一个垃圾堆

我已经研究了其他方法,但是它将每个字符分解成一个单独的数组元素,而不是用逗号。见:

我尝试过使用map()函数,也尝试过各种类型的强制转换,但似乎都没有成功


提前感谢。

这可能是一个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]

试试这个。我刚刚添加了删除字符串中除数字以外的任何符号的函数。在您的案例中,它有助于删除
[]

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: "")
    }

其他两个答案是可行的,尽管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", ...
它返回一个
Int
s的数组

编辑:对于喜欢不变性和函数式编程的人,有以下解决方案:

func toArray(string: String) -> [String] {
    return string[advance(string.startIndex, 2) ..< advance(string.endIndex, -2)]
        .componentsSeparatedByString("\",\"")
}
func-toArray(字符串:字符串)->[string]{
返回字符串[advance(string.startIndex,2)…
或者这个:

func toArray(string: String) -> [Int] {
    return string[advance(string.startIndex, 2) ..< advance(string.endIndex, -2)]
        .componentsSeparatedByString("\",\"")
        .flatMap{ Int($0) }
}
func-toArray(字符串:字符串)->[Int]{
返回字符串[advance(string.startIndex,2)…
Swift 1.2:

如果有人建议您要返回一个Int数组,那么您可以通过myString使用以下简洁的行获得该数组:

var myArrayOfInt2 = myString.componentsSeparatedByString("\"").map{$0.toInt()}.filter{$0 != nil}.map{$0!}
在Swift 2中(Xcode 7.0 beta 5):

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

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

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

此外,并分别:

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

// ...

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

您的字符串是否为“174580798”、“151240033”
。我指的是逗号分隔的字符串?是的(前面和后面都有方括号):)那么它已经是一个数组了。它看起来像一个数组,但它是字符串类型的,无法转换。您是否尝试过
componentsSeparatedByString
函数?这确实应该是可以接受的答案。原始字符串显然是JSON,这就是您解析JSON的方式。但是您没有发布性能丰富的答案,所以您可以离开你对自己的看法对你的代码有几点:你的函数
deleteAllExceptNumbers
实际上只对第一个和最后一个元素做了一些事情;它每次都创建一个NSCharacterSet;它每次都创建一个新字符串,即使99%的时间传入的字符串根本没有变化,追加也不便宜;你为什么要使用它<代码>\u{22}
而不仅仅是
\“
?;由于
append
s,您的
someArray
必须分配大量内存;原始字符串至少被遍历3次。。。很抱歉这么抱怨,但这不是很好的代码。我会考虑的,谢谢。你可以用
flatMap{Int($0)}
代替
map{Int($0)}。filter{$0!=nil}。map{$0!}
很好-我已经在我的答案中添加了这个解决方案。我真的很喜欢这是多么简洁。
var myArrayOfInt = myString.componentsSeparatedByString("\"").flatMap{ Int($0) }
// ...

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