如何从 Swift 4 中的描述中解析数组?
Posted
技术标签:
【中文标题】如何从 Swift 4 中的描述中解析数组?【英文标题】:How to parse array from description in Swift 4? 【发布时间】:2017-12-18 07:24:46 【问题描述】:我正在学习 Swift 4
,我有一个算法可以输出数组的 base 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 中的字符串数组?