Swift 可选的泛型类型不';方法调用中不接受nil

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

使用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, 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:
事件
发送方
,并且只需要第一个),但对调用方来说,使用重载方法也是可以的:如果传递
,您知道它不是可选的,而且调用者不必提供一个casted
nil
broadcastEvent(SettingsEvent.Baz, withValue: nil as NSString?)
func broadcastEvent<E: Event>(event: E) {
    broadcastEvent(event, withValue: nil as AnyObject?)
}