swift - 以更快速的方式从 Any Object 确定 Swift 对象类型

标签 swift types

我有一个 [String:Any] 的字典,当我从 UserDefaults 加载时,我得到了一个 Date 对象,但是来自 Firebase我取回了一个 Timestamp 对象。

肯定有我的 Swifty 方式来编写这段代码吗?

var correctDate:Date!

if let t = dictionary[key.timestamp] as? Timestamp {
    print("as Timestamp")
    correctDate = t.dateValue()
}
else if let t = dictionary[key.timestamp] as? Date {
    print("as Date")
    correctDate = t
}
else {
    fatalError("no date object found")
}

print(correctDate)

最佳答案

switch 是否更 Swifty?:

switch dictionary[key.timestamp] {
case let timestamp as Timestamp:
    print("as TimeStamp")
    correctDate = timestamp.dateValue()
case let date as Date:
    print("as Date")
    correctDate = date
default:
    fatalError("no date object found")
}

使用协议(protocol)

您有两个对象,它们都代表日期对象。为什么不用协议(protocol)统一它们并给它们一个通用接口(interface)?

使用协议(protocol)创建 DateTimestamp 都采用的 DateObject:

protocol DateObject {
    var date: Date { get }
}

extension Date: DateObject {
    var date: Date { return self }
}

extension Timestamp: DateObject {
    var date: Date { return self.dateValue() }
}

// Added this extension for NSDate after comments
// indicated that NSDate objects were coming back
// from UserDefaults
extension NSDate: DateObject {
    var date: Date { return self as Date }
}

if let date = (dictionary[key.timestamp] as? DateObject)?.date {
    print("has date")
    correctDate = date
} else {
    fatalError("no date object found")
}

关于swift - 以更快速的方式从 Any Object 确定 Swift 对象类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49842118/

相关文章:

使用泛型类型或接口(interface)的 C# 集合

swift - NavigationView + GeometryReader View 返回不正确的大小

ios - 更新按钮单击上的选择器值 swift 1.2

python - 转换 numpy 数组中特定列的数据类型

clojure - 我可以向 clojure 类型添加字段吗?

scala - scala.Singleton 是纯编译器小说吗?

swift - 调整容器 View 的高度以匹配 subview 的高度

ios - 淡化状态栏文本而不删除状态栏本身

ios - sqlite 加入查询 iPad

c++ - "if (var)"使用数字转换而不是 bool 值