美文网首页
修改子类中继承自父类的属性的类型

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

作者: 冰霜海胆 | 来源:发表于2018-09-09 13:16 被阅读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
    }
    
    // ----------
    

    相关文章

      网友评论

          本文标题:修改子类中继承自父类的属性的类型

          本文链接:https://www.haomeiwen.com/subject/nhorgftx.html