我该如何转换:
let numbersStringArray = "[-1, -2, -3, -4, -5, 6, -7, -8, -9, -10]"
进入整数数组:
[-1, -2, -3, -4, -5, 6, -7, -8, -9, -10]
我知道实现瘦swift的一种方法是这样做:
let formatter = NSNumberFormatter()
var numbers = numbersStringArray.stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "[]")).componentsSeparatedByString(",").map { formatter.numberFromString($0)?.integerValue
}
但我需要更短的编码解决方案。
答案 0 :(得分:3)
由于您告诉我们您的String始终格式化为JSON,因此您可以使用NSJSONSerialization
将其解码为数组:
if let data = numbersStringArray.dataUsingEncoding(NSUTF8StringEncoding),
json = try? NSJSONSerialization.JSONObjectWithData(data, options: []),
array = json as? [Int] {
print(array)
}
这并不比你的例子短,但我认为这是正确的做法。
答案 1 :(得分:2)
稍短一点
let numbers = numbersStringArray.stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "[]"))
.componentsSeparatedByString(", ")
.flatMap { Int($0) }
在这种情况下
numbersStringArray.stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "[]"))
也可以替换为
numbersStringArray.substringWithRange(numbersStringArray.startIndex.successor()..<numbersStringArray.endIndex.predecessor())
但这会使代码更长; - )
答案 2 :(得分:1)
如果可能,我想要更短的东西。像Array(numbersStringArray)
之类的东西
您只需通过Array
扩展程序创建便利初始化程序即可。
例如,通过JSON解码字符串,如@Eric D所示:
extension Array {
init?(jsonString: String) {
guard let array = (
try? JSONSerialization.jsonObject(with: Data(jsonString.utf8))
) as? [Element] else { return nil }
self.init(array)
}
}
的
let numbersStringArray = "[-1, -2, -3, -4, -5, 6, -7, -8, -9, -10]"
if let numberArray = [Int](jsonString: numbersStringArray) {
print(numberArray) // prints: [-1, -2, -3, -4, -5, 6, -7, -8, -9, -10]
}
这里我们返回一个可选数组,以反映类型可能不匹配的事实(条件向下转换为[Element]
可能会失败),或者JSON反序列化可能会失败。
或者按@vadian建议手动吐出字符串:
protocol StringInitialisable {
init?(string: String)
}
extension Int : StringInitialisable {
init?(string: String) {
self.init(string)
}
}
extension Array where Element : StringInitialisable {
init(string: String) {
self.init(
string.trimmingCharacters(in: CharacterSet(charactersIn: "[]"))
.components(separatedBy: ", ")
.flatMap(Element.init)
)
}
}
的
let numbersStringArray = "[-1, -2, -3, -4, -5, 6, -7, -8, -9, -10]"
let numberArray = [Int](string: numbersStringArray)
print(numberArray) // prints: [-1, -2, -3, -4, -5, 6, -7, -8, -9, -10]
我们在这里使用协议以明确指定可用于此初始化程序的类型 - 即可以使用字符串初始化的类型。如果类型转换失败,此方法将不返回可选项,它将简单地排除返回数组中的任何类型不匹配。如果您愿意,可以相当容易地更改它以返回可选结果。
您使用哪种方法完全取决于您 - 如果您的字符串始终采用JSON格式,那么我建议使用第一个选项以提高灵活性。