我有一个通过BLE UART连接与设备通信的应用程序。 收到数据时,会调用didReceiveData()委托。 在这里,我需要确定谁调用数据并触发相应的方法(另一个委托)。 我计划创建一个连接字典,该字典由建立连接时创建的connectionID字符串以及回调的选择器(可能不总是提供)创建。
class Connection: NSObject {
var selectr: Selector
var dataString: String?
init(selectR:Selector,dString:String) {
selectr = selectR
dataString = dString
}
}
connections[String:Connection]()
func sendData(dataString:String,callbackSelector:Selector){
con = Connection(selectR: callbackSelector, dString:"")
connections[cid] = con
}
... 致电:
let sel = Selector(anotherDelegate?.didReceiveLocation(""))
self.sendData("sendMe",Selector(anotherDelegate?.didReceiveLocation))
我做了一些错误,首先是Type NSData不符合协议StringLiteralConvertible。 NSData引用didReceiveLocation的参数。 第二个是在self.sendData行:无法调用' init'使用类型的参数列表(StringLiteralConvertible,Selector)。
这种方法有意义吗?如何将另一个委托的回调方法存储在字典或其他结构中,以使其可以从didReceiveData委托方法访问?
答案 0 :(得分:2)
选择器是如此Objective-C ...为什么不只是使用闭包?
使用String作为键和函数声明一个字典,该字符串将String作为参数并且不返回任何内容:
connections = [String:String->()]()
要声明一个带有单个String参数且没有返回值的闭包的函数,请使用以下内容:
func sendData(dataString:String, callback:String->()) {
...
connections[cid] = callback
...
}
要稍后调用该闭包,可以将其作为子例程调用(在这种情况下执行字典查找后,使用可选链接,以防它尚未分配):
func didReceiveData(...) {
...
connections[cid]?(response)
}
然后调用上面声明的sendData例程,并使用几个缩写语法之一传递一个闭包:
self.sendData("sendMe") { response in
...
}
请注意,这实际上是简写:
self.sendData("sendMe", callback:{ response:String in
...
})
请注意,Objective-C调用程序也可以使用此机制,因为闭包或多或少地直接映射到Objective-C块。
有关闭包,定义和调用的更多信息,我强烈建议从iTunes书店下载免费的Swift书。