如何与协议共享重用的 UIImageView?

How can I share a reused UIImageView with protocols?

我不确定这是否可行,但我有一些自定义 UITableViewCells,所有这些都包含一些通用组件。

例如,它们都包含一个代表用户头像的UIIMageView

   fileprivate var messageAvatar: UIImageView = {
        let imageView = UIImageView(frame: .zero)
        imageView.layer.cornerRadius = 35 / 2
        imageView.layer.masksToBounds = true
        imageView.image = #imageLiteral(resourceName: "user_avatar")
        return imageView
    }()

与其在多个地方重复这一点,我想我可以创建一个 Protocol 具有这些常用的必需属性,并使用扩展来为它们提供标准的默认实现:

protocol MyCustomCellProtocol: class {
    var avatar: UIImageView { get set }
}

extension MyCustomCellProtocol {
    var avatar: UIImageView {
        let imageView = UIImageView(frame: .zero)
        imageView.layer.cornerRadius = 35 / 2
        imageView.layer.masksToBounds = true
        return imageView
    }
}

我不明白的是我如何初始化这些或在我的自定义单元格中使用它们。

这是正确的方法吗?

我认为最好创建 UIImageView 的子类并在 awakeFromNib

中设置 "default" 属性
class AvatarImageView: UIImageView {
    override func awakeFromNib() {
        layer.cornerRadius = 35 / 2
        layer.masksToBounds = true
    }
}

然后您可以在需要时为 类 中的自定义子类创建图像视图作为 lazy 变量

lazy var messageAvatar: AvatarImageView = {
    let imageView = AvatarImageView(frame: .zero)
    imageView.image = UIImage(named: "user_avatar")
    return imageView
}()