修改子类中继承自父类的属性的类型

2018-09-09  本文已影响6人  冰霜海胆

在使用 UITableView 时,经常创建具体的模型来简化代码:

class Section: NSObject {

    var items: [Item]
    
    init(items: [Item]) {
        self.items = items
    }
}

class Item: NSObject {

    var title: String
    
    init(title: String) {
        self.title = title
    }
}

// ----------

var sections = [Section]()

let item = Item(title: "Title")
let section = Section(items: [item])
sections.append(section)

然后在 UITableView 的数据源方法中实现:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
    let cell = tableView.dequeueReusableCell(withIdentifier: UITableViewCell.self, for: indexPath)
        
    let item = sections[indexPath.section].items[indexPath.row] 
        
    cell.item = item
        
    return cell
}

但是当存在多种类型的 Cell 时,需要创建具体的模型来继承基础模型:

class SectionA: Section {
    var some: String?
}

class ItemA: Item {
    var isEdit = false
}

此时会产成一个问题,当在 UITableView 的数据源方法中实现模型传递时,需要强转类型:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
    let cell = tableView.dequeueReusableCell(withIdentifier: UITableViewCell.self, for: indexPath)
        
    let item = sections[indexPath.section].items[indexPath.row] as! SectionA
        
    cell.item = item
        
    return cell
}

如何直接获取类型,而不需要强转呢?需要使用泛型:

class Section<T: Item>: NSObject {

    var items: [T]
    
    init(items: [T]) {
        self.items = items
    }
}

class Item: NSObject {

    var title: String
    
    init(title: String) {
        self.title = title
    }
}

// ----------

class SectionA: Section<ItemA> {
    var some: String?
}

class ItemA: Item {
    var isEdit = false
}

// ----------
上一篇下一篇

猜你喜欢

热点阅读