我有一个基本问题.我正在开发一个包含许多委托模式的项目,并希望参考有关初始化它们的最佳方法.
以下是我制作的测试代表的一些想法:
选项1:
它失败了,因为我在super.init()之前启动了委托给自己
protocol MyClassDelegate { func doSomething() } class MyClass { var delegate: MyClassDelegate! init(delegate: MyClassDelegate){ self.delegate = delegate } func myClassFuction(){ self.delegate.doSomething() } } class ClassConformingToDelegate: NSObject,MyClassDelegate { let myClass: MyClass override init(){ myClass = MyClass(delegate: self) // Error because it's called before super.init super.init() } func doSomething(){ //called from the delegate } }
选项2:
它的工作原理,但是我冒着让委托成为nil的风险.每次我想调用一个方法时,我是否必须运行’if delegate!= nil’检查?有办法吗?以这种方式初始化委托是一个好习惯吗?
protocol MyClassDelegate { func doSomething() } class MyClass { var delegate: MyClassDelegate! init(){ } func myClassFuction(){ self.delegate.doSomething() // might fail if delegate is nil } } class ClassConformingToDelegate: NSObject,MyClassDelegate { let myClass: MyClass override init(){ myClass = MyClass() super.init() myClass.delegate = self // works because called after super.init } func doSomething(){ //called from the delegate } }
这只是一些想法.我只是想学习最好的方法.我对所有建议持开放态度.
谢谢!!
解决方法
选项2看起来更好.但是,在这种情况下,建议使用可选作为委托类型.这样,每次要使用它执行任务时,都不需要检查“if delegate!= nil”.您可以简单地使用可选链接,该链接专门针对您希望仅在包含值时在可选项上执行任务的情况.
protocol MyClassDelegate { func doSomething() } class MyClass { var delegate: MyClassDelegate? init(){ } func myClassFuction(){ self.delegate?.doSomething() // will do nothing if delegate is nil } } class ClassConformingToDelegate: NSObject,MyClassDelegate { let myClass: MyClass override init(){ myClass = MyClass() super.init() myClass.delegate = self } func doSomething(){ //called from the delegate } }