Ben hızlı bir jenerik sınıfı yarattı ve ben tip 'AdaptorType' ile bir adaptör başlatmak istiyorum, ama ben de) (init bunu initialize çalıştıSwift'de genel türe göre bir özellik nasıl oluşturulur?
class Sample<ItemType, AdaptorType> {
var items = Array<ItemType>()
let adaptor = AdaptorType() //Error: 'AdaptorType' is not constructible with '()'
}
Bir derleme hata aldım ama aynı sorun toke yer
class SampleGnericClass<ItemType, AdaptorType> {
var items = Array<ItemType>()
let adaptor : AdaptorType
init() {
adaptor = AdaptorType() //It doesn't work, same error occors here
}
}
genel tür AdaptorType başlangıç durumuna adaptör özelliği alma doğru yolu nedir? Çok teşekkür ederim!
DÜZENLEME: Yapmaya çalıştığınız gibi
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)
}
}
}
Eğer AdaptorType sınıfını gönderebilir misiniz? – Emilie
AdaptorType bir işlev/kapatma olmadıkça, '()' ile yapılamaz ... – Palimondo
@Emilie: Kodları yayınlandı. Teşekkür ederiz –