簡體   English   中英

將語法轉換為swift 3時,類型'Any'沒有下標成員嗎?

[英]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 ,其中todoItemTodoItem類的實例。

其次,由於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM