为啥我必须使用 .self 来快速引用类型对象?

Posted

技术标签:

【中文标题】为啥我必须使用 .self 来快速引用类型对象?【英文标题】:Why do I have to use .self to reference the type object in swift?为什么我必须使用 .self 来快速引用类型对象? 【发布时间】:2021-04-09 05:16:07 【问题描述】:

我正在配置一个集合视图以使用我自己的自定义单元格但是,我一直想知道为什么我必须在 collectionview.register(any class, forCellReuseIdentifier) 内的单元格类中包含 .self。

也许我的 OOP 技能只是在这里缺乏,但为什么 .self 会引用类型对象呢?为什么需要知道类型?任何帮助将不胜感激。

    func configureCollectionView() 
        collectionView = UICollectionView(frame: view.bounds, collectionViewLayout: UICollectionViewLayout())
        view.addSubview(collectionView)
        collectionView.backgroundColor = .systemPink
        //collectionView.register(FollowerCell.self, forCellWithReuseIdentifier: FollowerCell.reuseID)
        collectionView.register(FollowerCell, forCellWithReuseIdentifier: FollowerCell.reuseID)
    
class FollowerCell: UICollectionViewCell 
    static let reuseID = "FollowerCell"
    
    let avatarImageView = GFAvatarImageView(frame: .zero)
    let userNameLabel = GFTitleLabel(textAlignment: .center, fontSize: 16)
    
    override init(frame: CGRect) 
        super.init(frame: frame)
        configure()
        
    
    
    required init?(coder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    

【问题讨论】:

gist.github.com/Ben-G/cb1708b1068d2bc5916f 【参考方案1】:

这就是 Swift 的工作方式。当你被要求传递一个 type 作为参数时,你不能传递类型的裸名;你把名字加上.self

您只需要接受语言就是这样运作的。这就像为什么法语中的“yes”、“oui”是这样的;你不问为什么,你只是学习它并使用它。或者为什么在板球比赛中边界命中 4 分;你不要问为什么,这只是游戏规则。

【讨论】:

非常感谢您的回复!我想我只是有点困惑,为什么他们要求一种类型,而它专门只是要求上课。我的新手大脑只是想“哦,他们想要我的细胞课程,就是这样”。但我猜一个类是一个命名类型,每个单元格都需要知道是什么类型?这有点正确吗?谢谢! 您告诉表格视图在需要新单元格时应该实例化哪类单元格。所以它在问“什么课?”因此,您的答案必须采用ClassName.self 的形式。

以上是关于为啥我必须使用 .self 来快速引用类型对象?的主要内容,如果未能解决你的问题,请参考以下文章

为啥必须创建一个中间对象来引用 R 中的 xlsx 文件?

c++中重载输出操作符,为啥要返回引用

为啥委托是引用类型?

java 之数据类型

快速获取条件绑定的错误初始化程序必须具有可选类型,为啥?

为啥我不能使用 constexpr 全局变量来初始化 constexpr 引用类型?