Joe*_*yLD 10 xcode cocoa delegates swift2
我有一个基本问题.我正在开发一个具有许多委托模式的项目,并希望参考有关初始化它们的最佳方法.
以下是我制作的测试代表的一些想法:
它失败了因为我在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
}
}
Run Code Online (Sandbox Code Playgroud)
它的工作原理,但是我冒着让委托成为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
}
}
Run Code Online (Sandbox Code Playgroud)
这只是一些想法.我只是想学习最好的方法.我对所有建议持开放态度.
谢谢!!
小智 5
选项 2 看起来更好。但是,在这种情况下,建议使用 optional 作为您的委托类型。这样,每次要使用它执行任务时,您都不需要检查“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
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5348 次 |
| 最近记录: |