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...")
}
}
希望对您有所帮助。
我刚开始学习 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...")
}
}
希望对您有所帮助。