我有一个协议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”
给定委托后,目标返回委托对象并继续正常运行该函数
游乐场测试是这些:
答案 0 :(得分:0)
您对missingTransitionFromState的所有调用都有?最后,除了最后一个不会执行。更换!用一个?解决了这个问题。我真的不明白代码在做什么,但问号修复了它。
答案 1 :(得分:0)
进行以下更改可解决问题:
StateMachine
missingTransitionFromState
的{{1}}方法
dynamic
的{{1}}方法中的参数类型从StateMachine
更改为missingTransitionFromState
,以匹配其他String
方法的签名。我认为该方法需要String?
或missingTransitionFromState
才能使用dynamic
动态调用。但是,在添加之后,编译器会抱怨@objc
上对AnyObject
的调用不明确,因为有两个签名,因此您必须修复签名。