Swift 可选的泛型类型不';方法调用中不接受nil
使用Swift 2的类型化枚举功能,我可以定义一些可以由我的应用程序广播和收听的事件。这样我可以让编译器帮我检查,而且我不需要提供字符串Swift 可选的泛型类型不';方法调用中不接受nil,swift,Swift,使用Swift 2的类型化枚举功能,我可以定义一些可以由我的应用程序广播和收听的事件。这样我可以让编译器帮我检查,而且我不需要提供字符串 protocol Event: RawRepresentable {} // Somewhere in a view enum SettingsEvent: String, Event { case Bar case Baz } // Somewhere else in the app enum ViewEvents: String, Ev
protocol Event: RawRepresentable {}
// Somewhere in a view
enum SettingsEvent: String, Event {
case Bar
case Baz
}
// Somewhere else in the app
enum ViewEvents: String, Event {
case Foo
case Bar
}
事件可以广播,这是执行该功能的函数。
我需要使用两种泛型类型,因为:
- 协议“事件”只能用作一般约束,因为它具有自身或关联的类型要求
- V被传递到我控制的另一个泛型集合
broadcastEvent(SettingsEvent.Baz)
broadcastEvent(SettingsEvent.Baz, withValue: nil)
编者说:
错误:无法使用类型为“(SettingsEvent,withValue:NilLiteralConvertible)”的参数列表调用“broadcastEvent”
注意:应为类型为“(E,withValue:V?)的参数列表”
这有什么问题?这是因为通过将
AnyObject
定义为泛型,您使用的是AnyObject
协议(而不是对象)。协议不符合NilLiteralConvertible
one,因此无法识别nil-literal
在您的情况下,您应该这样定义您的方法:
func broadcastEvent<E: Event>(event: E, withValue value: AnyObject? = nil)
func广播事件(事件:E,带值:AnyObject?=nil)
类型推断并非无所不知。调用泛型方法时,编译器必须知道您使用的泛型类型。类型推断无法看到nil
应该是什么类型,因此必须显式指定类型
broadcastEvent(SettingsEvent.Baz, withValue: nil as NSString?)
还要注意,String
是一个struct
,因此它不符合AnyObject
。使用文本“aa”
将使其成为NSString
我认为,仅通过定义一个单独的方法,无法将泛型类型与默认参数值nil
相结合
func broadcastEvent<E: Event>(event: E) {
broadcastEvent(event, withValue: nil as AnyObject?)
}
func广播事件(事件:E){
broadcastEvent(事件,带值:nil作为AnyObject?)
}
太好了,谢谢。我将提供不同的方法。虽然我更喜欢使用单一方法(也因为我的例子中的参数是3:事件
,发送方
和值
,并且只需要第一个),但对调用方来说,使用重载方法也是可以的:如果传递值
,您知道它不是可选的,而且调用者不必提供一个castednil
。
broadcastEvent(SettingsEvent.Baz, withValue: nil as NSString?)
func broadcastEvent<E: Event>(event: E) {
broadcastEvent(event, withValue: nil as AnyObject?)
}