【问题标题】:Different behavior between T.Type & [T.Type]T.Type 和 [T.Type] 之间的不同行为
【发布时间】:2018-09-13 12:43:21
【问题描述】:

我正在使用泛型函数来改进 tableView 单元格,如下所示;

public func registerNib<T: UITableViewCell>(_:T.Type) {
    print("Registering.....")
    print(T.self)
    let nib = UINib(nibName: String(describing: T.self), bundle: nil)
    register(nib, forCellReuseIdentifier: String(describing: T.self))
}

我写了两个函数来注册单元格,一个用于单个单元格,一个用于多个单元格。

//单格寄存器

func setup<T: UITableViewCell>(cell:T.Type) {
   print(cell)
   tableView.registerNib(cell)
   self.setupParameters(.....)
}

//多个单元格寄存器

func setup<T: UITableViewCell>(cells:[T.Type]) {
   for cell in cells {
        print(cell)
        tableView.registerNib(cell)
    }
   self.setupParameters(.....)
}

对于单细胞实现,你可以如下调用func,它会正确注册Nib。

self.baseTableView.setup(cell: CompetencyCell.self, rowHeight: 60)

**************
Output:
CompetencyCell
Registering...
CompetencyCell

但是多个实现会出现问题;

self.baseTableView.setup(cells: [CompetencyCell.self, BehaviorCell.self], rowHeight: 60)

**************
Output:
CompetencyCell
BehaviorCell
Registering...
UITableViewCell
UITableViewCell

我真的很想知道是什么原因,或者我想念什么?它看起来像相同的行为,但是当我想将 T.Type 值传递给 RegisterNib 方法时,它转向 UITableViewCell 并且在某些时候我当然崩溃了,因为它找不到单元格。

你有什么建议吗? 非常感谢。

【问题讨论】:

    标签: swift uitableview generics metatype


    【解决方案1】:

    在调用泛型函数时,泛型类型T 表示单个静态类型。

    [T.Type] 是无意义的,因为它声明了一个 same 类型说明符的数组。

    T 不代表Any

    【讨论】:

    • 感谢您的回复。你知道任何解决方法吗?我应该如何做到这一点?
    【解决方案2】:

    如 vadian 的回答中所述,泛型不是与包含多种类型值的数组一起使用的好工具。

    你可以试试这样的:

    extension UITableView {
        public func registerNib(_ type: UITableViewCell.Type) {
            print("Registering.....")
            print(type)
            let nib = UINib(nibName: String(describing: type), bundle: nil)
            register(nib, forCellReuseIdentifier: String(describing: type))
        }
    }
    

    还有这个:

    func setup(cells: [UITableViewCell.Type] /*, otherParams: ...*/) {
        for cell in cells {
            print(cell)
            tableView.registerNib(cell)
        }
        //self.setupParameters(.....)
    }
    

    【讨论】:

    • 感谢您的回答。它起作用了,但我真的很想知道为什么泛型不适合使用 Array 包含多种类型的值?
    • @GöktuğAral,Swift 静态推断泛型类型。因此,使用您的定义 setup&lt;T: UITableViewCell&gt;(cells:[T.Type]),Swift 在每次调用时静态推断类型 T。当您将其称为 setup(cells: [CompetencyCell.self, BehaviorCell.self]) 时,您认为 Swift 推断出 T 是什么类型。 T 需要是某种可以同时表示CompetencyCell.selfBehaviorCell.self 的类型,T 被推断为UITableViewCell,因为它是它们的共同祖先。泛型参数在运行时不会动态变化,需要在编译时解决。
    猜你喜欢
    • 2020-08-20
    • 1970-01-01
    • 2018-05-29
    • 2022-11-17
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 2021-03-18
    相关资源
    最近更新 更多