ios - 如何使用共享初始化方法初始化 let 变量?

标签 ios swift

我想使用 let 设置一个变量,这样它就不是可选的,不会随着时间的推移而改变,也不需要每次都进行困惑的解包来访问。我知道我可以合法地设置它,但只能在 init 方法之一中进行。问题是 Swift 要求您覆盖 init(coder aDecoder: NSCoder) 初始化程序。但是,我从来没有一个应用程序调用过该初始化程序。它总是调用 init(frame: CGRect) 初始化程序。因此,如果我不必重写 init(coder aDecoder: NSCoder),那么我只需在 中执行 self.imageView = UIImageView.new() init(frame: CGRect) 我已经完成了,但是编译器提示它也没有在另一个 init 中设置。我尝试制作一个从两个初始化调用的 sharedInit() 方法,但编译器不允许我从那里设置 imageView,因为它只在初始化之外读取方法。如果不直接在 init 方法中执行所有 init 两次,您应该如何完成此操作?

class SuperCoolView : UIView {

    let imageView: UIImageView

    required init(coder aDecoder: NSCoder) {
        sharedInit()
        super.init(coder: aDecoder)
    }

    override init(frame: CGRect) {
        sharedInit()
        super.init(frame: frame)
    }

    func sharedInit() {
        self.imageView = UIImageView.new()
        // Other similar shared init
    }

}

最佳答案

我找到了 this answer 并喜欢它的方法。它解决了这个问题,并且更干净恕我直言。通过实现 init(coder aDecoder: NSCoder) 通常我们会保持这样的外观,即这个 View 可以从 nib/storyboard 初始化,但它不能。

class SuperCoolView : UIView {

let imageView: UIImageView

required init(coder aDecoder: NSCoder) {
    fatalError("NSCoding not supported")
}

override init(frame: CGRect) {
    self.imageView = UIImageView.new()
    // Other stuff
    super.init(frame: frame)
}

关于ios - 如何使用共享初始化方法初始化 let 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29111874/

相关文章:

ios - Swift 变量约束

swift - 如何使用异步回调修改结构?

ios - 尝试将主机字符串链接到模拟器 SDK (Linphone) 时出现错误

ios - 手动编辑 iOS Storyboard文件在技术上可以吗?

ios - 多个命令在 Xcode 13 中产生错误

ios - 从模态返回时视频播放器未加载

Swift - 带链接的 HTML 风格化 NSAttributedString

ios - 如何修复 "This coder only encodes objects that adopt NSSecureCoding (object is of class ' _SwiftValue')."来自 Crashlytics 的崩溃

ios - UITableView 和 heightForRowAtIndexPath 的偶尔问题

iphone - 通过iPhone配置实用程序安装应用程序时出错