2016-05-18 6 views
4

Zum Beispiel zu erklären, wird dieser Ausschnitt aus UIColor Definition in Swift genommen:Swift: Wie eine Eigenschaft mit Klassen Namen

// Access the underlying CGColor or CIColor. 
public var CGColor: CGColor { get } 

jedoch für das gleiche zu tun versuchen, lassen Sie sich NSError sagt, in meiner eigenen Klasse einen Fehlerursachen:

public class MyClass { 
    public var NSError: NSError { 
     return NSError(domain: "mydomain", code: 0, userInfo: [:]) 
    } 
} 

Die varUse of undeclared type 'NSError' Zeile zeigt.

Ist das noch möglich? Was ist ein guter Weg, dies zu tun?

Apple-Swift-Version 2.2 (swiftlang-703.0.18.1 Klirren-703.0.29)
Ziel: x86_64-Apfel-macosx10.9

+0

bestätigt mit einfachen 'foo' Klasse –

Antwort

4

Sie könnte dies durch eine typealias Schaffung für NSError, NSErrorRef. Sie würden sich dann auf diese Typalias in Ihrer Klasse beziehen, da sich NSError jetzt auf eine Eigenschaft und nicht auf eine Klasse beziehen würde.

public typealias NSErrorRef = NSError 

public class MyClass { 
    public var NSError:NSErrorRef { 
     return NSErrorRef(domain: "", code: 0, userInfo: nil) 
    } 
} 

Allerdings würde ich nie empfehlen dies.

Ich vermute, der einzige Grund, CGColor heißt so im Swift-Header von UIColor ist einfach Interoperabilität mit Objective-C zu erhalten. Warum es ohne verwirrende Fehler funktioniert - kann ich nicht sagen. Obwohl, wenn Sie tatsächlich in der Dokumentation von UIColor suchen, sehen Sie CGColor is actually listed as cgColor (wenn Swift ausgewählt ist) - die zeigt, sogar Apple denkt, dass es nicht richtig definiert ist!

In jedem Fall besagt die Konvention, dass Eigenschaften mit einem Kleinbuchstaben beginnen sollten (um diese Art von Verwirrung in erster Linie zu vermeiden). So könnte man diese stattdessen tun:

public class MyClass { 
    public var nsError:NSError { 
     return NSError(domain: "", code: 0, userInfo: nil) 
    } 
} 

Oder noch besser, Sie könnten nur Ihr Eigentum nennen error - als Präfix selten in Swift sowieso verwendet werden soll (es sei denn, Sie müssen eindeutig zu machen - was Sie wirklich brauchen erscheinen zu tun in Ihrem Fall).

public class MyClass { 
    public var error:NSError { 
     return NSError(domain: "", code: 0, userInfo: nil) 
    } 
} 
+0

Die Klasse ist eigentlich eine Fehlerklasse so ein einfaches 'error' Eigenschaft nicht viel Sinn macht macht. Ich möchte Accessor zur Verfügung stellen, um 'NSError 'also die Frage zu bekommen. Wie auch immer, danke für die Antwort !!! – chakrit

+1

@chakrit Ah gut 'nsError' macht dann in dieser Situation vollkommen Sinn, um zu disambiguieren. Glücklich, um zu helfen :) – Hamish

Verwandte Themen