如何确定Swift中函数中泛型参数类型的类型?

时间:2015-04-09 14:04:41

标签: swift generics

我有一个符合该协议的协议和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,但我问你,以防这个场景有更好的方法。

谢谢。

1 个答案:

答案 0 :(得分:0)

毕竟,你们很多人都不需要callbackOf{File,Folder}个人区别Data。也许

class Observer {
  var callbacks : [((Data) -> Void)] : []

  func addCallback (callback: (Data) -> Void) {
    callbacks.append(callback)
  }

  func invokeCallbacks () {
    /* ... */
  }
}

如果您只需要在FileFolder类型上调用不同的回调代码,那么您可以在结构中执行此操作。像这样:

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()`。