Ios 理解Swift中的实例化-为什么不在自定义类中使用require

Ios 理解Swift中的实例化-为什么不在自定义类中使用require,ios,swift,uitableview,swift2,Ios,Swift,Uitableview,Swift2,我的理解是,在Swift中,您不需要导入类(仅针对某些框架),但需要进行插入,但令我惊讶的是,这可能不是真的,我创建了一个自定义类(CustomCell.Swift)对于我在UITableView中使用的自定义单元格,显然在使用它之前不需要创建自定义类的实例。下面是我如何使用它 自定义单元类 // CustomCell.swift import UIKit class CustomCell: UITableViewCell { @IBOutlet weak var labelDi

我的理解是,在Swift中,您不需要导入类(仅针对某些框架),但需要进行插入,但令我惊讶的是,这可能不是真的,我创建了一个自定义类(
CustomCell.Swift
)对于我在UITableView中使用的自定义单元格,显然在使用它之前不需要创建自定义类的实例。下面是我如何使用它

自定义单元类

//  CustomCell.swift

import UIKit

class CustomCell: UITableViewCell {

    @IBOutlet weak var labelDisplayWattage: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}
视图控制器

//  ViewController.swift
import UIKit

class ViewController: UIViewController, UITableViewDataSource {

// some code ...

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCellWithIdentifier("reusableCell", forIndexPath: indexPath) as! CustomCell

        cell.labelDisplayWattage.text = String(totalWattageList[indexPath.row])

        return cell
    }

}
正如您所看到的,
CustomCell
类的实例没有被调用方法
cellforrowatinexpath
As!CustomCell

有人能告诉我为什么在方法
cellforrowatinexpath
中使用类
CustomCell
之前不需要创建它的实例吗?我期待着看到像

var myCustomCell = CustomCell()

根据apple docs提供的数据源方法,谢谢

 func dequeueReusableCellWithIdentifier(_ identifier: String,forIndexPath indexPath: NSIndexPath) -> UITableViewCell 
出于性能原因,表视图的数据源通常应 当UITableViewCell对象将单元格指定给其 tableView:cellForRowAtIndexPath:method。表视图维护一个 数据源具有的UITableViewCell对象的队列或列表 标记为可重复使用。在以下情况下从数据源对象调用此方法: 要求为表视图提供新单元格此方法将退出队列 现有单元格(如果可用),或基于 以前注册的类或nib文件,并将其添加到 表。

因此,如果队列为空,它基本上会为您创建一个新对象


来源:

根据apple docs for Datasource方法

 func dequeueReusableCellWithIdentifier(_ identifier: String,forIndexPath indexPath: NSIndexPath) -> UITableViewCell 
出于性能原因,表视图的数据源通常应 当UITableViewCell对象将单元格指定给其 tableView:cellForRowAtIndexPath:method。表视图维护一个 数据源具有的UITableViewCell对象的队列或列表 标记为可重复使用。在以下情况下从数据源对象调用此方法: 要求为表视图提供新单元格此方法将退出队列 现有单元格(如果可用),或基于 以前注册的类或nib文件,并将其添加到 表。

因此,如果队列为空,它基本上会为您创建一个新对象

来源:

CustomCell的实例化是tableview的责任,我们只获取该单元格,如果在获取该单元格时该单元格未实例化,tableview将在将其返回给我们之前对其进行实例化

这种行为属于建筑设计,而不是swift特有的。对于objective-c,它也以同样的方式工作

CustomCell的实例化是tableview的责任,我们只获取该单元格,如果在获取该单元格时该单元格未实例化,tableview将在将其返回给我们之前对其进行实例化


这种行为属于建筑设计,而不是swift特有的。对于objective-c,它也以同样的方式工作

您现在看到的代码下面有一个非常重要的概念。如果使用的是故事板,则表视图和集合视图可以选择使用原型单元。原型单元格是可以/将与表视图或集合视图一起使用的单元格模板。如果您的表/集合视图设置为使用原型单元格,则无需创建新单元格,
UIKit
通过调用
tableView.dequeueReusableCellWithIdentifier
为您创建一个排队单元格

不使用原型单元时,请考虑以下事项:

//  ViewController.swift
import UIKit

class ViewController: UIViewController, UITableViewDataSource {

// some code ...

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell = tableView.dequeueReusableCellWithIdentifier("reusableCell", forIndexPath: indexPath) as? CustomCell
        if nil == cell {
            cell = CustomCell()
            // more cell options can be set here
        }
        cell.labelDisplayWattage.text = String(totalWattageList[indexPath.row])
        return cell
    }

}

在您现在看到的代码下面有一个非常重要的概念。如果使用的是故事板,则表视图和集合视图可以选择使用原型单元。原型单元格是可以/将与表视图或集合视图一起使用的单元格模板。如果您的表/集合视图设置为使用原型单元格,则无需创建新单元格,
UIKit
通过调用
tableView.dequeueReusableCellWithIdentifier
为您创建一个排队单元格

不使用原型单元时,请考虑以下事项:

//  ViewController.swift
import UIKit

class ViewController: UIViewController, UITableViewDataSource {

// some code ...

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell = tableView.dequeueReusableCellWithIdentifier("reusableCell", forIndexPath: indexPath) as? CustomCell
        if nil == cell {
            cell = CustomCell()
            // more cell options can be set here
        }
        cell.labelDisplayWattage.text = String(totalWattageList[indexPath.row])
        return cell
    }

}

是的,我用的是一个原型电池。谢谢,是的,我用的是原型电池。谢谢