Sen*_* Xu 12 generics xcode cocoa-touch ios swift
我在swift中创建了一个泛型类,我想初始化一个类型为'AdaptorType'的适配器,但是我收到了一个编译错误
class Sample<ItemType, AdaptorType> {
var items = Array<ItemType>()
let adaptor = AdaptorType() //Error: 'AdaptorType' is not constructible with '()'
}
Run Code Online (Sandbox Code Playgroud)
我也尝试在init()中初始化它,但同样的问题toke place
class SampleGnericClass<ItemType, AdaptorType> {
var items = Array<ItemType>()
let adaptor : AdaptorType
init() {
adaptor = AdaptorType() //It doesn't work, same error occors here
}
}
Run Code Online (Sandbox Code Playgroud)
使用泛型类型AdaptorType初始化适配器属性的正确方法是什么?非常感谢!
编辑:关于这个问题的完整代码
import UIKit
protocol XYManagedObject {
}
protocol XYNetworkProtocol {
typealias ManagedObjectType : XYManagedObject
func object(fromItemDictionary dictionary: NSDictionary?) -> ManagedObjectType?
func objects(fromEntryDictionary dictionary: NSDictionary?) -> Array<ManagedObjectType>?
func actionParameters(page: UInt?) -> (action: String, parameters: Dictionary<String, String>?)
func pageSize() -> UInt? // nil for unlimited
}
class ProductAdaptor : XYNetworkProtocol {
var filter = Dictionary<String, String>()
typealias ManagedObjectType = XYProductObject
func object(fromItemDictionary dictionary: NSDictionary?) -> ManagedObjectType? {
//... Will return an object here
return nil
}
func objects(fromEntryDictionary dictionary: NSDictionary?) -> Array<ManagedObjectType>? {
//... will return an array of objects here
return nil
}
func actionParameters(page: UInt?) -> (action: String, parameters: Dictionary<String, String>?) {
var parameters = filter
if page {
parameters["page"] = "\(page!)"
}
return ("product_list", parameters)
}
func pageSize() -> UInt? {
return 100
}
}
class XYDataManager<ItemType: XYManagedObject, AdaptorType: XYNetworkProtocol> {
var objects = Array<ItemType>()
let adaptor = ProductAdaptor() //work around, adaptor should be any type conform to XYNetworkProtocol
func loadPage(page: UInt?) -> (hasNextPage: Bool, items: Array<ItemType>?) {
let fetcher = XYFetchController()
let ap = adaptor.actionParameters(page)
if let fetchedResult = fetcher.JSONObjectForAPI(ap.action, parameters: ap.parameters) {
let npage = fetchedResult["npage"].integerValue
var hasNextPage = true
if !npage || !page {
hasNextPage = false
}
else if npage <= page {
hasNextPage = false
}
let objects = adaptor.objects(fromEntryDictionary: fetchedResult)
return (hasNextPage, (objects as Array<ItemType>?))
}
else {
return (false, nil)
}
}
}
Run Code Online (Sandbox Code Playgroud)
并非所有对象都可以像您尝试的那样在没有参数的情况下进行初始化。您必须将一个已初始化的实例传递给您的类的初始值设定项
您还可以定义自己的协议,该协议需要一个空的初始值设定项(通过添加init到它)并将 AdapterType 限制为该协议
| 归档时间: |
|
| 查看次数: |
6186 次 |
| 最近记录: |