AnyObject在被调用时无法识别正确的函数

时间:2014-08-05 20:49:56

标签: ios swift

我有一个协议StateMachineDelegate,一个符合它的类DataSource,以及一个具有这种协议的委托的StateMachine类

这两个类都实现了在协议上找到的函数,这样如果类有一个委托,就让它们处理函数;否则班级自己处理它。

StateMachine包含这样的函数:

  func target() -> AnyObject {
    return delegate ?? self
  }

我的完整代码是这样的:

import Foundation

@objc protocol StateMachineDelegate {

  optional func stateWillChange()
  optional func stateDidChange()

  optional func missingTransitionFromState(fromState: String?, toState: String?) -> String

}

class StateMachine {

  var delegate: StateMachineDelegate?

  func target() -> AnyObject {
    return delegate ?? self
  }

  func missingTransitionFromState(fromState: String, toState: String) -> String {
    return "Hello"
  }
}

class DataSource: StateMachineDelegate {

  func missingTransitionFromState(fromState: String?, toState: String?) -> String {
    return "Hi"
  }

}

当我在playground中运行一些测试并且StateMachine实例没有委托时,目标函数返回与AnyObject相同的实例。但是一旦我从目标中调用了missingTransitionFromState,它就崩溃了所以我把它改成了missingTransitionFromState?()并返回了nil

最后一个功能行应该返回“Hello”

给定委托后,目标返回委托对象并继续正常运行该函数

游乐场测试是这些: enter image description here

2 个答案:

答案 0 :(得分:0)

您对missingTransitionFromState的所有调用都有?最后,除了最后一个不会执行。更换!用一个?解决了这个问题。我真的不明白代码在做什么,但问号修复了它。

答案 1 :(得分:0)

进行以下更改可解决问题:

  1. 使用StateMachine
  2. 注释missingTransitionFromState的{​​{1}}方法
  3. dynamic的{​​{1}}方法中的参数类型从StateMachine更改为missingTransitionFromState,以匹配其他String方法的签名。
  4. 我认为该方法需要String?missingTransitionFromState才能使用dynamic动态调用。但是,在添加之后,编译器会抱怨@objc上对AnyObject的调用不明确,因为有两个签名,因此您必须修复签名。