我有一个符合该协议的协议和2结构,我有一个带泛型的函数(对协议的约束)。在函数中,我必须根据参数的类型获取一些数据。我试图找到一种方法来做到这一点,但我仍然不确定哪种方式最适合这种情况。
protocol Data {
var id: String { get }
}
struct File: Data {
var id: String
var size: Int
}
struct Folder: Data {
var id: String
var color: Int
}
class Observer {}
private var callbacksOfFile: [String: ObserverSet<File>] = [:]
private var callbacksOfFolder: [String: ObserverSet<Folder>] = [:]
func subscribeUpdateForData<T: Data>(data: Data, withCallback callback: (T) -> Void) -> Observer {
if let file = data as? File, let callbacks = callbacksOfFile[data.id] {
callbacks.add(callback) // Error
} else if let folder = data as? Folder, let callbacks = callbacksOfFolder[data.id] {
callbacks.add(callback) // Error
}
}
处理此案件的最佳方法是什么?现在我使用函数重载而不是Generic,但我问你,以防这个场景有更好的方法。
谢谢。
答案 0 :(得分:0)
毕竟,你们很多人都不需要callbackOf{File,Folder}
个人区别Data
。也许
class Observer {
var callbacks : [((Data) -> Void)] : []
func addCallback (callback: (Data) -> Void) {
callbacks.append(callback)
}
func invokeCallbacks () {
/* ... */
}
}
如果您只需要在File
和Folder
类型上调用不同的回调代码,那么您可以在结构中执行此操作。像这样:
protocol Data {
var id: String { get }
func processData ();
}
struct File: Data {
var id: String
var size: Int
func processData () {
/* implement for File */
}
}
struct Folder: Data {
var id: String
var color: Int
func processData () {
/* implement for Folder */
}
}
然后适当地调用'processData()`。