我在操场上实现了一个GreetingDelegate协议,该协议带有一个函数sayHi(假设)和一个符合所述协议的类Data。
我还有一个名为Class的类,它有一个符合GreetingDelegate的委托,另一个sayHi函数,以及一个确定谁应该响应sayHi的函数。
如果Class没有委托触发他自己的sayHi函数版本,但如果委托存在则触发该委托的函数版本。
protocol GreetingDelegate {
func sayHi(name: String) -> String
}
class Class {
var delegate: GreetingDelegate?
func sayHi(name: String) -> String {
return "Hello, \(name)"
}
func target() -> Any {
if let delegate = delegate {
return delegate
}
return self
}
}
class Data: GreetingDelegate {
func sayHi(name: String) -> String {
return "Hi, \(name)"
}
}
let classInstance = Class()
classInstance.sayHi("Matt")
classInstance.target()
let dataInstance = Data()
dataInstance.sayHi("Matt")
classInstance.delegate = dataInstance
classInstance.sayHi("Matt")
classInstance.target()
奇怪的是,当我在分配任何委托之前调用目标函数时,它应该返回nil,它应该返回它自己。真的很感激这个问题的帮助。
如果有任何帮助,我会附上游乐场结果的图片。
更新#1
当我将target()的返回类型更改为AnyObject时,它不会返回nil,但它不会接受委托作为返回结果。
答案 0 :(得分:1)
它正在返回{nil},因为这就是属于该Class实例的所有变量(因为委托是可选的,它默认为nil)。如果添加其他变量,例如
var num: Int = 1
到班级,它将返回{nil,1}。所以它返回的是对象 - 而不是类名,但基本上是它的数据成员的摘要。
答案 1 :(得分:0)
在第一种情况下调用target
函数,然后设置委托返回self
实例,其delegate
值为nil
。 {nil} 表示具有委托值的实例未初始化。
在第二种情况下,在设置委托返回target
实例并将其self
值作为delegate
对象后调用Data
函数。 {Data} 表示委托值设置为Data
个对象。