ios – 如何通过Swift中的泛型类型构造一个属性?

前端之家收集整理的这篇文章主要介绍了ios – 如何通过Swift中的泛型类型构造一个属性?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在 swift中创建了一个泛型类,我想使用“AdaptorType”类型初始化一个适配器,但是我收到一个编译错误
  1. class Sample<ItemType,AdaptorType> {
  2. var items = Array<ItemType>()
  3. let adaptor = AdaptorType() //Error: 'AdaptorType' is not constructible with '()'
  4. }

我也尝试在init()中初始化它,但是同样的问题在于

  1. class SampleGnericClass<ItemType,AdaptorType> {
  2. var items = Array<ItemType>()
  3. let adaptor : AdaptorType
  4.  
  5. init() {
  6. adaptor = AdaptorType() //It doesn't work,same error occors here
  7. }
  8. }

使用通用类型AdaptorType初始化适配器属性的正确方法是什么?万分感谢!

编辑:关于这个问题的完整代码

  1. import UIKit
  2.  
  3. protocol XYManagedObject {
  4.  
  5. }
  6.  
  7. protocol XYNetworkProtocol {
  8.  
  9. typealias ManagedObjectType : XYManagedObject
  10.  
  11. func object(fromItemDictionary dictionary: NSDictionary?) -> ManagedObjectType?
  12. func objects(fromEntryDictionary dictionary: NSDictionary?) -> Array<ManagedObjectType>?
  13. func actionParameters(page: UInt?) -> (action: String,parameters: Dictionary<String,String>?)
  14. func pageSize() -> UInt? // nil for unlimited
  15. }
  16.  
  17. class ProductAdaptor : XYNetworkProtocol {
  18.  
  19. var filter = Dictionary<String,String>()
  20.  
  21. typealias ManagedObjectType = XYProductObject
  22.  
  23. func object(fromItemDictionary dictionary: NSDictionary?) -> ManagedObjectType? {
  24. //... Will return an object here
  25. return nil
  26. }
  27.  
  28. func objects(fromEntryDictionary dictionary: NSDictionary?) -> Array<ManagedObjectType>? {
  29. //... will return an array of objects here
  30. return nil
  31. }
  32.  
  33. func actionParameters(page: UInt?) -> (action: String,String>?) {
  34. var parameters = filter
  35. if page {
  36. parameters["page"] = "\(page!)"
  37. }
  38.  
  39. return ("product_list",parameters)
  40. }
  41.  
  42. func pageSize() -> UInt? {
  43. return 100
  44. }
  45. }
  46.  
  47. class XYDataManager<ItemType: XYManagedObject,AdaptorType: XYNetworkProtocol> {
  48.  
  49. var objects = Array<ItemType>()
  50. let adaptor = ProductAdaptor() //work around,adaptor should be any type conform to XYNetworkProtocol
  51.  
  52. func loadPage(page: UInt?) -> (hasNextPage: Bool,items: Array<ItemType>?) {
  53. let fetcher = XYFetchController()
  54.  
  55. let ap = adaptor.actionParameters(page)
  56. if let fetchedResult = fetcher.JSONObjectForAPI(ap.action,parameters: ap.parameters) {
  57.  
  58. let npage = fetchedResult["npage"].integerValue
  59. var hasNextPage = true
  60. if !npage || !page {
  61. hasNextPage = false
  62. }
  63. else if npage <= page {
  64. hasNextPage = false
  65. }
  66.  
  67. let objects = adaptor.objects(fromEntryDictionary: fetchedResult)
  68. return (hasNextPage,(objects as Array<ItemType>?))
  69. }
  70. else {
  71. return (false,nil)
  72. }
  73. }
  74. }

解决方法

并不是所有的对象都可以被初始化,而不是你想要的参数.你必须将初始化的实例带到你的类的初始化器

您还可以定义自己的协议,需要一个空的初始化器(通过向其中添加init),并将AdapterType限制为该协议

猜你在找的iOS相关文章