gpt4 book ai didi

ios - 如何使用 SWXMLHash 反序列化 NSDate

转载 作者:搜寻专家 更新时间:2023-10-31 22:45:56 25 4
gpt4 key购买 nike

我正在使用 SWXMLHash并在 NSDate 上为 XMLElementDeserializable 编写了一个扩展

我在 this file 的末尾了解了基本类型是如何扩展的.

我看到的是这样的:

import Foundation
import SWXMLHash

struct BlogPost: XMLIndexerDeserializable {
let date: NSDate

static func deserialize(blogPost: XMLIndexer) throws -> BlogPost {
return try BlogPost(
date: blogPost["date"].value()
)
}
}

extension NSDate: XMLElementDeserializable {
/**
Attempts to deserialize XML element content to an NSDate

- element: the XMLElement to be deserialized
- throws: an XMLDeserializationError.TypeConversionFailed if the element cannot be deserialized
- returns: the deserialized NSDate value formatted as "EEE, dd MMM yyyy HH:mm:ss zzz"
*/
public static func deserialize(element: XMLElement) throws -> NSDate {
guard let dateAsString = element.text else {
throw XMLDeserializationError.NodeHasNoValue
}

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "EEE, dd MMM yyyy HH:mm:ss zzz"
let date = dateFormatter.dateFromString(dateAsString)

guard let validDate = date else {
throw XMLDeserializationError.TypeConversionFailed(type: "Date", element: element)
}
return validDate
}
}

但是,我收到一条错误消息:

Method 'deserialize' in non-final class 'NSDate' must return 'Self' to conform to protocol 'XMLElementDeserializable'

我环顾了 S.O.对于同一错误的其他答案,我没有从他们那里收集到太多信息。

如有任何建议,我们将不胜感激。谢谢!

最佳答案

好吧,这很奇怪,但问题是存在的,因为 NSDate 是一个 class 而不是 struct。显然需要做一些工作才能使类符合返回 self 的协议(protocol) - 使它与结构一起工作要容易得多!

(在 Swift 4 中,这是不必要的,因为 Date 是一个结构)

我必须添加一些额外的文档来展示它是如何工作的。

检查以下代码(根据您的示例修改)以查看它是否适合您:

import Foundation
import SWXMLHash

extension NSDate: XMLElementDeserializable {
// NOTE: for SWXMLHash 3.0 with Swift 3.0, this will be (_ element: XMLElement)
public static func deserialize(element: XMLElement) throws -> Self {
guard let dateAsString = element.text else {
throw XMLDeserializationError.NodeHasNoValue
}

let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "EEE, dd MMM yyyy HH:mm:ss zzz"
let date = dateFormatter.dateFromString(dateAsString)

guard let validDate = date else {
throw XMLDeserializationError.TypeConversionFailed(type: "Date", element: element)
}

// NOTE THIS
return value(validDate)
}

// AND THIS
private static func value<T>(date: NSDate) -> T {
return date as! T
}
}

let xml = "<root><elem>Monday, 23 January 2016 12:01:12 111</elem></root>"

let parser = SWXMLHash.parse(xml)

let dt: NSDate = try! parser["root"]["elem"].value()

另见 Return instancetype in SwiftUsing 'self' in class extension functions in Swift .

注意:添加了注释,指出这对于 SWXMLHash 3.0 看起来会略有不同。

关于ios - 如何使用 SWXMLHash 反序列化 NSDate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38174669/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com