2016-03-21 11 views
1

Hier ist die Objective-C-Version.So verweisen Sie auf einen Typ selbst in Swift

+ (NSDictionary *)modelContainerPropertyGenericClass { 
    return @{ 
     "picIds" : String, 
     "picInfos" : [WBPicture class] 
    }; 
} 

Ich habe es auf diese Weise, aber der Compiler warf den Fehler

static func modelContainerPropertyGenericClass() -> [String: AnyClass] { 
    return [ 
     "picIds" : String.self, 
     "picInfos" : WBPicture.self 
    ] 
} 
+1

Sie haben eine zusätzliche Klammer ']' im Array-Konstruktor – redent84

Antwort

3

Das Problem ist, dass String nicht AnyObject nicht entspricht, weil es eine struct ist, und AnyClass ist nur ein typealias für AnyObject.Type.

Ändern der Rückgabetyp Any.Type auch structs und Grundtypen wie Int, Float und Bool akzeptieren:

static func modelContainerPropertyGenericClass() -> [String: Any.Type] { 
    return [ 
     "picIds": String.self, 
     "picInfos": WBPicture.self 
    ] 
} 

zu halten Objective-C-Kompatibilität, ersetzen structs und Grundtypen mit dem objektiv- C-kompatible Klasse:

static func modelContainerPropertyGenericClass() -> [String: AnyClass] { 
    return [ 
     "picIds": NSString.self, 
     "picInfos": WBPicture.self, 
     "int": NSNumber.self, 
    ] 
} 
+0

vielen Dank!, Es funktioniert ! Übrigens möchte ich diese Funktion zu einem Protokoll hinzufügen und als eine optionale markieren, aber der Compiler sagte Methode kann kein Mitglied eines Objc-Protokolls sein, weil sein Ergebnistyp nicht in Objective-C dargestellt werden kann Möglichkeit, die Funktion in einem Protokoll als optional zu markieren, ohne objc vor dem Protokoll-Schlüsselwort zu setzen? –

+0

Leider nein, optionale Protokolle erfordern Objective-C-Kompatibilität, ansonsten verhalten sie sich wie objektorientierte Standardschnittstellen, die implementiert werden müssen. Sie können zurück zu 'AnyClass' wechseln und Objective-C-Klassen wie' NSString' und 'NSNumber' verwenden, wenn Sie sie benötigen. Siehe meine aktualisierte Antwort. – redent84

+0

Oh, ich verstehe. Danke für Ihre Hilfe! –

1

versuchen diese

static func modelContainerPropertyGenericClass() -> [String : Any.Type] { 
return ["picIds": String.self, "picInfos": WBPicture.self] 
} 
+0

Dies kompiliert keine – redent84

+0

aktualisierte Antwort. – Sahil

+0

Kompiliert immer noch nicht :( – redent84

0

Ihr Problem ist, ist String nicht Art von Class seiner Struktur. Definition von String ist;

public struct String { 
    /// An empty `String`. 
    public init() 
} 

Sie müssen es definieren Any.Type

static func modelContainerPropertyGenericClass() -> [String : Any.Type] { 
    return ["picIds": String.self, "picInfos": UITableViewCell.self] 
} 
+0

Vielen Dank! Es funktioniert, aber ich kann nur eine Antwort als die richtige markieren, tut mir leid, dass –

Verwandte Themen