【问题标题】:Convert string array representation of integers into array of integers in Swift在 Swift 中将整数的字符串数组表示形式转换为整数数组
【发布时间】:2016-05-23 12:40:24
【问题描述】:

如何转换:

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
 }

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

【问题讨论】:

  • 为什么?如果你有什么工作......
  • 是否总是 JSON 格式?
  • numbersStringArray 是字符串数组还是格式化为数组的字符串?
  • 一个看起来像数组的字符串
  • 它是否总是包含格式正确的整数?

标签: arrays string swift


【解决方案1】:

由于您告诉我们您的字符串始终格式化为 JSON,您可以使用 NSJSONSerialization 将其解码为数组:

if let data = numbersStringArray.dataUsingEncoding(NSUTF8StringEncoding),
        json = try? NSJSONSerialization.JSONObjectWithData(data, options: []),
        array = json as? [Int] {
    print(array)
}

这并不比你的例子短,但我认为这是正确的做法。

【讨论】:

    【解决方案2】:

    稍微短一点

    let numbers = numbersStringArray.stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "[]"))
                                    .componentsSeparatedByString(", ")
                                    .flatMap { Int($0) }
    

    在这种情况下

    numbersStringArray.stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "[]"))
    

    也可以用

    代替
    numbersStringArray.substringWithRange(numbersStringArray.startIndex.successor()..<numbersStringArray.endIndex.predecessor())
    

    但这会使代码更长;-)

    【讨论】:

    • 谢谢,但如果可能的话,我想要更短的。类似 Array(numbersStringArray)
    • 您可以使用flatMap 过滤掉非整数字符串
    • 感谢改进,我更新了答案。 @IamMashed 追求最高效而非最短的代码。
    • @Wain 所以你是说我的愿望是不可能的?
    • @IamMashed 你总是可以编写一个带有自定义初始化程序的Array 扩展来执行此操作。我有 written an answer 演示你如何做到这一点。
    【解决方案3】:

    如果可能的话,我想要更短的。类似 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 格式,那么我建议您使用第一个选项以提高灵活性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-25
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 2019-04-21
      相关资源
      最近更新 更多