代码之家  ›  专栏  ›  技术社区  ›  Göktuğ Aral

T.Type和[T.Type]之间的不同行为

  •  0
  • Göktuğ Aral  · 技术社区  · 8 年前

    我正在使用泛型函数改进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,它将正确注册。

    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,当然,在某个时间点之后,我会崩溃,因为它找不到单元格。

    你有什么建议吗? 谢谢。

    2 回复  |  直到 8 年前
        1
  •  1
  •   vadian    8 年前

    当调用泛型函数时 T 表示 单一的 静态类型。

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

    T型 并不意味着 Any !

        2
  •  1
  •   OOPer    8 年前

    正如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(.....)
    }
    
    推荐文章