在函数中返回self会让我迅速失败

时间:2014-08-05 13:50:29

标签: ios delegates swift

我在操场上实现了一个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,它应该返回它自己。真的很感激这个问题的帮助。

如果有任何帮助,我会附上游乐场结果的图片。enter image description here

更新#1

当我将target()的返回类型更改为AnyObject时,它不会返回nil,但它不会接受委托作为返回结果。

2 个答案:

答案 0 :(得分:1)

它正在返回{nil},因为这就是属于该Class实例的所有变量(因为委托是可选的,它默认为nil)。如果添加其他变量,例如

var num: Int = 1

到班级,它将返回{nil,1}。所以它返回的是对象 - 而不是类名,但基本上是它的数据成员的摘要。

答案 1 :(得分:0)

在第一种情况下调用target函数,然后设置委托返回self实例,其delegate值为nil {nil} 表示具有委托值的实例未初始化。

在第二种情况下,在设置委托返回target实例并将其self值作为delegate对象后调用Data函数。 {Data} 表示委托值设置为Data个对象。