2015-04-15 5 views
16

ich bin sehr neu zu schnellen und zu versuchen, eine Erweiterung der UIColor Klasse alsZugriff auf die Erweiterung von UIColor in SWIFT?

extension UIColor{ 

    func getCustomBlueColor() -> UIColor{ 

    return UIColor(red:0.043, green:0.576 ,blue:0.588 , alpha:1.00) 

    } 

Danach zu erstellen zugegriffen i die Methode als

btnShare.setTitleColor(UIColor.getCustomBlueColor(**UIColor**), forState: UIControlState.Normal) 

Ich weiß nicht, was ich als Argument übergeben sollte diese Aussage.

+2

Sie haben keine Argumente überhaupt passieren, rufen Sie einfach 'UIColor.getCustomBlueColor()' – tkanzakic

+0

@tkanzakic wäre es kein 'Klasse func' sein müssen, um Zugang zu so? - Benutzer Beispiel müsste zugegriffen werden wie 'UIColor(). GetCustomBlueColor()' – Wez

+0

yeah..wezly so ich herauszufinden, wie auf den Instanztyp nicht Klassen –

Antwort

39

Sie definiert hat eine Instanzmethode, was bedeutet, dass Sie es nur auf einer UIColor Instanz anrufen:

let col = UIColor().getCustomBlueColor() 
// or in your case: 
btnShare.setTitleColor(UIColor().getCustomBlueColor(), forState: .Normal) 

Der Fehler Compiler „fehlendes Argument“ tritt auf, weil Instance Methods are Curried Functions in Swift, so könnte es äquivalent als

genannt werden
let col = UIColor.getCustomBlueColor(UIColor())() 

(Aber das wäre eine seltsame Sache zu tun, und ich habe hinzugefügt es nur zu erklären, wo die Fehlermeldung kommt.)


Aber was Sie wirklich wollen, ist ein Typ Methode (class func)

extension UIColor{ 
    class func getCustomBlueColor() -> UIColor{ 
     return UIColor(red:0.043, green:0.576 ,blue:0.588 , alpha:1.00) 
    } 
} 

die als

let col = UIColor.getCustomBlueColor() 
// or in your case: 
btnShare.setTitleColor(UIColor.getCustomBlueColor(), forState: .Normal) 
genannt wird

ohne die Notwendigkeit, zuerst eine UIColor Instanz zu erstellen.

+0

danke martin es macht mich jetzt klar ... aber diese aussage kompiliert nicht direkt auf xcode 6.3 lass col = UIColor.getCustomBlueColor (UIColor()) –

+1

@ copeME: Ich habe derzeit keinen Zugriff auf Xcode 6.3, das kann ich erst später überprüfen. Aber ich erwähnte 'let col = UIColor.getCustomBlueColor (UIColor())' nur, um die Compiler-Fehlermeldung zu erklären, das ist nicht das, was Sie eigentlich tun sollten. Sie sollten es wirklich als eine Typmethode mit 'class' definieren. –

+0

yeah ich war Versuch zu prüfen, wie man zugreifen, wenn es eine Instanz Methoden..thanks martin war –

2

Sie müssen nur Ihre Aussage wie ändern, ist

btnShare.setTitleColor(UIColor().getCustomBlueColor(), forState:.Normal) 

Detailliertere Erklärung here.

+0

danke ronit..ich macht mir jetzt klar –

1

Sie haben eine Instanzfunktion definiert. Das bedeutet, dass Sie eine Instanz von UIColor benötigen, um getCustomBlueColor() -method zu verwenden.

Es sieht so aus, als ob Sie eine Klassenmethode anstelle der Instanzmethode haben möchten. So müssen Sie Ihre Definition wie folgt ändern:

extension UIColor{ 
    class func getCustomBlueColor() -> UIColor{ 
     return UIColor(red:0.043, green:0.576 ,blue:0.588 , alpha:1.00) 
    } 
} 

Beachten Sie die ‚Klasse‘ vor func, so dass das Verfahren nun zugänglich als Klassenmethode ist.

Die gleiche Geschichte von Klassenmethoden in einer Struktur mit:

struct MyColors{ 
    static func getCustomBlueColor() -> UIColor{ 
     return UIColor(red:0.043, green:0.576 ,blue:0.588 , alpha:1.00) 
    } 
} 
let color = MyColors.getCustomBlueColor() 

Wenn Sie nur eine Klasse mit einigen Farbdefinitionen haben wollen, empfehle ich Ihnen, eine Struktur über eine Klasse oder Erweiterung zu verwenden:

struct MyColors{ 
    static var getCustomBlueColor = { return UIColor(red:0.043, green:0.576 ,blue:0.588 , alpha:1.00) } 
} 
let color = MyColors.getCustomBlueColor() 
+0

Hallo @ Chuck. Ich habe deine Antwort formatiert. Schau einfach mal! –

+0

danke :-) Ich bin wirklich neu zu stackoverflow, so tut mir leid für Formatierungsfehler – Chuck

0

Könnte eine berechnete Eigenschaft:

extension UIColor { 
    var customBlueColor: UIColor { 
    return UIColor(red:0.043, green:0.576 ,blue:0.588 , alpha:1.00) 
    } 
} 

Und dann nennen:

var myColor: UIColor = .white // or .clear or whatever 

Deshalb, wenn Sie wollen etwas ähnliches, wie die folgenden ...

var myColor: UIColor = .myCustomColor 

:

UIColor().customBlueColor 
17

Mit Swift 3 werden entsprechend vordefinierten UIColors verwendet ... dann würden Sie die Erweiterung wie folgt definieren:

extension UIColor 
    { 
    public class var myCustomColor: UIColor 
     { 
     return UIColor(red: 248/255, green: 248/255, blue: 248/255, alpha: 1.0) 
     } 
    } 

Tatsächlich definiert Apple-weiß wie:

public class var white: UIColor 
+0

'var myColor = UIColor.myCustomColor' ist weit mehr geeignet FYI. Sie sollten Typinferenz immer über explizites Typcasting verwenden. Dies ist in zahlreichen Bereichen des Swift-Buchs dokumentiert, das Apple zur Verfügung gestellt hat, und wurde während WWDC-Keynotes als Best Practice angesehen. – TheCodingArt

+2

TheCodingArt - das ist Ihre Meinung, keine Tatsache.Ihre Stimmen und Kommentare sind irreführend und ehrlich gesagt unverantwortlich. Die kompilierte Ausgabe von Typinferenz und expliziten Typcasting ist identisch. Siehe: http://stackoverflow.com/questions/24588893/swift-explicit-vs-inverredred-typing-performance Ich für meinen Teil bevorzuge die Lesbarkeit meines Codes gegenüber dem, was Sie gepostet haben, aber auch das, wie Ihres, ist nur eine Meinung. –

+0

Was ich sagte, war Tatsache nicht Meinung. Eine Meinung wird nicht durch direkt von Apple abgegebene Empfehlungen gebildet, die in zahlreichen Bereichen dokumentiert sind, aber eine Annahme wird gemacht, indem ich annehme, dass ich derjenige bin, der Sie gewählt hat. Wenn Sie mehr über die empfohlene empfohlene Swift-API und allgemeine Nutzungsrichtlinien erfahren möchten, hat Apple zahlreiche öffentlich verfügbare Ressourcen als Referenz zur Verfügung gestellt. Ich würde wirklich empfehlen, Ihre Fakten zu verstehen und auch Apples Richtlinien zu überprüfen, die eher Ihren persönlichen Vorlieben entsprechen. – TheCodingArt

8

Swift 3:

extension UIColor { 
    static let myBlue = UIColor(red:0.043, green:0.576 ,blue:0.588, alpha:1.00) 
} 

Verwendung:

btnShare.setTitleColor(.myBlue, for: .normal) 

Oder

self.view.backgroundColor = .myBlue 
0

Swift:

extension UIColor { 
    open class var yourOrange: UIColor { 
     return UIColor.init(colorLiteralRed: 0.988, green: 0.337, blue: 0.063, alpha: 1) 
    } 
}