将整数的字符串数组表示转换为Swift中的整数数组

时间:2016-05-23 12:40:25

标签: arrays string swift

我该如何转换:

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
 }

但我需要更短的编码解决方案。

3 个答案:

答案 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格式,那么我建议使用第一个选项以提高灵活性。