我在Swift中有一个字符串,如下所示:
["174580798","151240033","69753978","122754394","72373738","183135789","178841809","84104360","122823486","184553211","182415131","70707972"]
我需要将其转换为NSArray。
我已经查看了SO上的其他方法,但它将每个字符分成单独的数组元素,而不是打破逗号。请参阅:Convert Swift string to array
我试过使用map()函数,我也尝试了各种类型的转换,但似乎没有什么可以接近。
提前致谢。
答案 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
}