如何从 Swift 4 中的描述中解析数组?

Posted

技术标签:

【中文标题】如何从 Swift 4 中的描述中解析数组?【英文标题】:How to parse array from description in Swift 4? 【发布时间】:2017-12-18 07:24:46 【问题描述】:

我正在学习 Swift 4,我有一个算法可以输出数组的 ba​​se 64 描述,如下所示:

extension String 

    func fromBase64() -> String? 
        guard let data = Data(base64Encoded: self) else 
            return nil
        

        return String(data: data, encoding: .utf8)
    

    func toBase64() -> String 
        return Data(self.utf8).base64EncodedString()
    

let output = [1, 2, 4, 65].description.toBase64()
print(output.fromBase64()) // "[1, 2, 4, 65]"

现在,我的问题是我需要将数组放回Array,而不是String。 我在网上查了一下,找不到这种类型的数组的解析方法(他们都在谈论JSON)。

【问题讨论】:

您不应该依赖description 方法来产生特定的输出。 【参考方案1】:

您不应依赖description 方法来生成特定的 可预测的输出,最好为此目的使用 JSON 编码器 (以下示例)。

话虽如此,"[1, 2, 4, 65]" 恰好是一个有效的 JSON 数组, JSON 解码器可以将其解析回一个整数数组:

let output = "[1, 2, 4, 65]"
do 
    let array = try JSONDecoder().decode([Int].self, from: Data(output.utf8))
    print(array) // [1, 2, 4, 65]
 catch 
    print("Invalid input", error.localizedDescription)

这是一个独立的示例,您可以如何可靠地编码和解码 与 Base64 编码字符串之间的整数数组。

// Encode:
let intArray = [1, 2, 4, 65]
let output = try! JSONEncoder().encode(intArray).base64EncodedString()
print(output) // WzEsMiw0LDY1XQ==

// Decode:
let output = "WzEsMiw0LDY1XQ=="
if let data = Data(base64Encoded: output),
    let array = try? JSONDecoder().decode([Int].self, from: data) 
    print(array) // [1, 2, 4, 65]
 else 
    print("Invalid input")

【讨论】:

You should not rely on the description method to produce a particular predictable output Cleary 有什么要强调的。谁说在 ios 的下一个版本中 Apple 不会更改 description?剩下的,JSON、Encodable、Plist、CSV、NSCoding,没关系,看使用目的(share it?“crypt it”?等)然后用最好的方案来使用.【参考方案2】:

以下是将字符串转换为Int 数组的方法:

var toString = output.fromBase64() //"[1, 2, 4, 65]"
if let str = toString 
    let chars = CharacterSet(charactersIn: ",][ ")
    let split = str.components(separatedBy: chars).filter  $0 != "" .flatMap  Int($0)
    print(split)  //[1, 2, 4, 65]

【讨论】:

以上是关于如何从 Swift 4 中的描述中解析数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 alamofire 返回 json 解析为 Swift 中的字符串数组?

如何在 Swift 3 中使用 Alamofire 4 解析这个 json?

如何正确解析 SWIFT 中的 JSON 对象

iOS如何从解析Swift 4中获取行[关闭]

将数组中的数组解析为swift 4中的一些数组?

iOS如何从解析Swift 4中获取值“布尔”