swift - 如何使 IndexPath rawRepresentable ?

标签 swift xcode indexpath

我正在尝试重构代码并创建一个枚举类来保存 TableView 单元格的indexPath。

我想让代码这样工作:

enum TableViewCell: IndexPath {
     case shopImageView = [0,0]
     case selectShopImageButton = [0,1]
}

但是编译器说indexPath不是rawRepresentable:

'TableViewCell' declares raw type 'IndexPath', but does not conform to RawRepresentable and conformance could not be synthesized

Raw value for enum case must be a literal

如何使indexPath rawRepresentable?目前的代码是这样工作的,我想改进它。

enum TableViewCell {
    case shopImageView
    case selectShopImageButton
    case shopNameLocal
    case shopNameEN
    case addressLocal
    case addressEN
    case selectAddressButton
    case openingHours
    case datePickers
    case phone
    case email
    case uploadShopFormButton
    
    var indexPath: IndexPath {
        switch self {
        case .shopImageView:         return [0,0]
        case .selectShopImageButton: return [0,1]
        case .shopNameLocal:         return [0,2]
        case .shopNameEN:            return [0,3]
        case .addressLocal:          return [0,4]
        case .addressEN:             return [0,5]
        case .selectAddressButton:   return [0,6]
        case .openingHours:          return [0,7]
        case .datePickers:           return [0,8]
        case .phone:                 return [0,9]
        case .email:                 return [0,10]
        case .uploadShopFormButton:  return [0,11]
        }
    }
}

最佳答案

使用硬编码 TableView IndexPath 的另一种方法是使用具有静态属性的 enum。这样做的好处是,如果您在各种 TableView 委托(delegate)方法中引用 IndexPath,并且需要更改 IndexPath 引用,那么你只需在枚举中更改它们一次。

 private enum TableIndex {
    // Section 0: Information
    static let information =        IndexPath(row: 0, section: 0)
    // Section 1: Preferences
    static let notifications =      IndexPath(row: 0, section: 1)
    static let units =              IndexPath(row: 1, section: 1)
    static let hapticFeedback =     IndexPath(row: 2, section: 1)
    // Section 2: Links
    static let leaveReview =        IndexPath(row: 0, section: 2)
    static let support =            IndexPath(row: 1, section: 2)
    static let privacyPolicy =      IndexPath(row: 2, section: 2)
    static let disclaimer =         IndexPath(row: 3, section: 2)
}

然后您可以像这样引用它们:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    switch indexPath {
    case TableIndex.information:
        // do something
    case TableIndex.notifications:
        // do something
    case TableIndex.units:
        // do something

        // etc

    default:
        break
    }
}

关于swift - 如何使 IndexPath rawRepresentable ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56580271/

相关文章:

xcode - 在新的Interface Builder中无法放大和缩小 Nib

iphone - 如何在 iPhone 中阻止来电

ios - 如何在 iOS Swift 中设置特定索引的 Collection View 单元格?

ios - 查找容器单元格的索引

objective-c - 如何克服 CString 错误

iOS 从文件中读取

ios - 根据字体大小将文本滚动到 UITextView 中的特定点

swift - 无法将 UITableViewCell 中的单元格数据推送到新的 UITableViewController

ios - 在更改单元格上重置 UICollectionView

ios - 下拉隐藏导航项时,刷新控件在表格 View 上方留下大间隙