[英]When convert syntax to swift 3, Type 'Any' has no subscript members?
錯誤“類型'Any'沒有下標成員”。 在行返回$ 0 [“ deadline”]。
這僅在我將語法轉換為swift 3時發生。
TodoList文件
fileprivate let ITEMS_KEY = "todoItems"
func allItems() -> [TodoItem] {
let todoDictionary = UserDefaults.standard.dictionary(forKey: ITEMS_KEY) ?? [:]
let items = Array(todoDictionary.values)
return items.map({TodoItem(deadline: $0["deadline"] as Date, title: $0["title"] as! String, UUID: $0["UUID"] as! String!)}).sort({(left: TodoItem, right:TodoItem) -> Bool in
(left.deadline.compare(right.deadline) == .orderedAscending)
})
}
TodoItem文件
struct TodoItem {
var title: String
var deadline: Date
var UUID: String
init(deadline: Date, title: String, UUID: String) {
self.deadline = deadline
self.title = title
self.UUID = UUID
}
var isOverdue: Bool {
return (Date().compare(self.deadline) == ComparisonResult.orderedDescending)
}
}
首先,您不能使用下let deadline = todoItem.deadline
訪問結構的值,而必須使用點語法,如下所示: let deadline = todoItem.deadline
,其中todoItem
是TodoItem
類的實例。
其次,由於UserDefaults.dictionary(forKey:)
返回類型為[String:Any]
字典, UserDefaults
必須將檢索到的字典從UserDefaults
為[String:TodoItem]
[String:Any]
。
請參見下面的工作代碼:
func allItems() -> [TodoItem] {
let todoDictionary = UserDefaults.standard.dictionary(forKey: ITEMS_KEY) as? [String:TodoItem] ?? [:]
let items = Array(todoDictionary.values)
return items.map({TodoItem(deadline: $0.deadline, title: $0.title, UUID: $0.UUID)}).sort({(left: TodoItem, right:TodoItem) -> Bool in
(left.deadline.compare(right.deadline) == .orderedAscending)
})
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.