尝试对 Swift 中的列进行排序时出错 "Initializer for conditional binding must have Optional type, not 'String'" 5、NSTableView

Error "Initializer for conditional binding must have Optional type, not 'String'" trying to sort column in Swift 5, NSTableView

我在网上收到错误 Initializer for conditional binding must have Optional type, not 'String'

guard let id1 = p1.artist, let id2 = p2.artist else { return true }

关于如何消除这个错误有什么建议吗?谢谢!

func setSortDescriptor() {
    let idDescriptor = NSSortDescriptor(key: "cellArtist", ascending: true)
    tableView.tableColumns[0].sortDescriptorPrototype = idDescriptor
}


func tableView(_ tableView: NSTableView, sortDescriptorsDidChange oldDescriptors: [NSSortDescriptor]) {
    guard let sortDescriptor = tableView.sortDescriptors.first else { return }
    sortRecords(ascending: sortDescriptor.ascending)
    tableView.reloadData()
}

func sortRecords(ascending: Bool) {
    myRecords.sort { (p1, p2) -> Bool in
        guard let id1 = p1.artist, let id2 = p2.artist else { return true }
        if ascending {
            return id1 < id2
        } else {
            return id2 < id1
        }
    }
}
    

您没有显示 p1p2 的类型,但至少在一个(如果它们是同一类型,则可能是两个)上显示 属性 artist 定义为 String。为了使用 guard letif let,您要绑定的 variable/property 必须是可选的(例如 String?)。

如果它们都是非可选的 String,则没有理由执行 guard 语句,因为没有什么可绑定的——您可以直接在 [=19 上进行比较=] 和 p2.artist.

更多关于可选绑定的阅读:https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html