Xcode 9.4.1 Ошибка компилятора, говорящая о том, что значение типа Int не имеет члена rawValue - PullRequest
0 голосов
/ 16 октября 2018

Я новичок в изучении Swift и практических занятиях по UITableView, в которых используется приложение со списком задач.Лучший способ описать мою проблему - это то, что rawValue должен быть из определения 'enum Priority {}' внутри TodoList.swift, но к нему нет доступа с помощью func itemDetailViewController внутри ChecklistviewController.swift.

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)
}

Я попробовал перейти к другому сообщению ( Как получитьсчетчик перечисления Swift? ), который показал метод создания собственного протокола CaseCountalbe, чтобы настроить перечисление так, чтобы оно соответствовало CaseIterable, как в Swift 4.2.К сожалению, я все еще не понимаю, как данные передаются между файлами.В таком случае, как можно получить rawValue из enum Priority, чтобы отключить предупреждение компилятора?

1 Ответ

0 голосов
/ 16 октября 2018

Вы пытаетесь получить доступ к rawValue объекта priority.ОДНАКО, что priority на самом деле Int.

Если вы измените строку let indexPath = IndexPath(row: index, section: priority.rawValue)

на

let indexPath = IndexPath(row: index, section: currentList.priority.rawValue), она, вероятно, будет работать, предполагая, что currentList с TodoList является перечислением.

Вернемся к основам перечисления в Swift.

Если, например, у нас есть перечисление с именем PhoneType, которое имеет тип rawValue Int:

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

тогда мы можем создать экземпляр PhoneType, передав rawValue Int, и использовать перечисление в выражениях 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...")
    }
}

Надеюсьэто помогает.

...