Xcode 9.4.1 编译器错误说“Int”类型的值没有成员“rawValue”

Xcode 9.4.1 Compiler error saying that Value of type ‘Int’ has no member ‘rawValue’

我刚开始学习 Swift 和练习涉及待办事项列表应用程序的 UITableView 教程。我能描述我的问题的最好方法是 rawValue 应该来自 TodoList.swift 内的 'enum Priority { }' 定义,但它没有被 ChecklistviewController.swift 内的 'func itemDetailViewController' 访问。

TodoList.swift

protocol CaseCountable {
    static var caseCount: Int { get }
}

extension CaseCountable where Self: RawRepresentable, Self.RawValue == Int {
    internal static var caseCount: Int {
        var count = 0
        while let _ = Self(rawValue: count) {
             count += 1
        }
        return count
    }
}

class TodoList {

    enum Priority: Int, CaseCountable {
      case high = 0, medium = 1, low = 2, no = 3   
    }
    .
    .
    .

}

ChecklistViewController.swift

class ChecklistViewController: UITableViewController {

    var todoList: TodoList

    private func priorityForSectionIndex(_ index: Int) -> TodoList.Priority? {
       return TodoList.Priority(rawValue: index)
    }

    .
    .
    . 

}

extension ChecklistViewController: ItemDetailViewControllerDelegate {
    .
    .
    .
    func itemDetailViewController(_ controller: ItemDetailViewController, didFinishEditing item: ChecklistItem) {

       for priority in 0...(TodoList.Priority.caseCount-1) {
         let currentList = todoList.todoList(for: TodoList.Priority(rawValue: priority)!)
         if let index = currentList.index(of: item) {
             let indexPath = IndexPath(row: index, section: priority.rawValue) //COMPILER ERROR
             if let cell = tableView.cellForRow(at: indexPath) {
                configureText(for: cell, with: item)
             }
         }
    }
    navigationController?.popViewController(animated: true)
}

我尝试关注另一个 post (How do I get the count of a Swift enum?),它展示了一种技术来创建你自己的协议,称为 CaseCountalbe,以便自定义一个枚举,使其表现得好像它符合 CaseIterable,就像在Swift 4.2。不幸的是,我仍然对文件之间如何传递数据感到困惑。在这种情况下,如何从 enum Priority 中获取 rawValue 来消除编译器警告?

您正在尝试访问 priority 对象的 rawValue。然而,priority 实际上是一个 Int

如果你换行let indexPath = IndexPath(row: index, section: priority.rawValue)

let indexPath = IndexPath(row: index, section: currentList.priority.rawValue) 它可能会工作,假设 currentList 有一个 TodoList 这是一个枚举。

让我们回到 Swift 中枚举的基础知识。

例如,如果我们有一个名为 PhoneType 的枚举,它的原始值类型为 Int:

enum PhoneType: Int {
    case iPhone5s = 568
    case iPhone8 = 667
    case iPhone8Plus = 736
    case iPhoneX = 812
}

然后我们可以通过传递 Int 的原始值来创建 PhoneType 的实例,并在 switch 或 if-else 语句中使用枚举,如下所示:

let screenHeight = Int(UIScreen.main.bounds.height)

if let type = PhoneType(rawValue: screenHeight) {
    switch type {
    case .iPhone5s: print("we are using iPhone5s and similar phones like SE/5C/5")
    case .iPhone8: print("we are using iPhone 8 and similar phones")
    case .iPhone8Plus: print("we are using iPhone 8plus or 7plus or 6 plus.")
    default: print("and so on...")
    }
}

希望对您有所帮助。