2015-04-15 8 views
16

Sono molto nuovo alla rapida e cercando di creare un'estensione della classe UIColor comeCome accedere all'estensione di UIColor in SWIFT?

extension UIColor{ 

    func getCustomBlueColor() -> UIColor{ 

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

    } 

Dopo questo ho avuto accesso al metodo

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

Non so cosa devo passare come argomento di questa dichiarazione.

+2

devi passare alcun argomento a tutti, basta chiamare 'UIColor.getCustomBlueColor()' – tkanzakic

+0

@tkanzakic sarebbe non c'è bisogno di essere un 'func' classe per accedere in quel modo? - L'esempio degli utenti dovrebbe essere accessibile come 'UIColor(). GetCustomBlueColor()' – Wez

+0

sì..wezly quindi stavo cercando di capire come accedere al tipo di istanza e non a quelli di classe –

risposta

39

È stato definito un metodo di esempio, il che significa che si può chiamare solo su un UIColor esempio:

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

L'errore del compilatore "argomento mancante" si verifica perché Instance Methods are Curried Functions in Swift, in modo che possa equivalentemente si chiami come

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

(ma sarebbe una cosa strana da fare, e ho aggiunto solo per spiegare dove il messaggio di errore viene da.)


Ma che cosa si vuole veramente è un metodo tipo (class func)

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

che si chiama come

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

senza la necessità di creare prima un'istanza UIColor.

+0

grazie martin mi fa chiaro ora ... ma questa dichiarazione non si compila direttamente su xcode 6.3 lascia col = UIColor.getCustomBlueColor (UIColor()) –

+1

@ copeME: Al momento non ho accesso a Xcode 6.3, quindi posso verificarlo solo più tardi. Ma ho menzionato 'let col = UIColor.getCustomBlueColor (UIColor())' solo per spiegare il messaggio di errore del compilatore, che non è quello che dovresti effettivamente fare. Dovresti davvero definirlo come un metodo di tipo con 'class'. –

+0

sì, stavo colpendo la prova su come accedere quando era un metodo di istanza ... grazie martin –

2

Hai solo bisogno di cambiare la sua dichiarazione come,

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

spiegazione più dettagliata è here.

+0

grazie ronit..it mi rende chiaro ora –

1

È stata definita una funzione di istanza. Significa che hai bisogno di un'istanza di UIColor nel caso in cui utilizzare il metodo getCustomBlueColor().

Sembra che si desideri avere un metodo di classe, anziché il metodo di istanza. Quindi devi cambiare la tua definizione in questo modo:

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

nota la 'classe' prima func, in modo che il metodo è ora accessibile come metodo di classe.

La stessa storia utilizzando i metodi della classe in una struttura:

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

Se si desidera semplicemente avere una classe con alcune definizioni dei colori, vi consiglio di utilizzare una struttura su una classe o estensione:

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

ciao @Chuck. Ho formattato la tua risposta. Basta dare un'occhiata! –

+0

grazie :-) Sono davvero nuovo per StackOverflow, quindi mi dispiace per aver fatto errori di formattazione – Chuck

0

Potrebbe utilizzare una proprietà calcolata:

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

E poi chiamarlo:

UIColor().customBlueColor 
17

Con Swift 3, UIColors predefiniti vengono utilizzati di conseguenza:

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

Pertanto, se si vuole qualcosa di simile, come ad esempio il seguente ...

var myColor: UIColor = .myCustomColor 

... quindi, definiresti l'estensione in questo modo:

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

In realtà, Apple definisce bianco come:

public class var white: UIColor 
+0

'var myColor = UIColor.myCustomColor' è molto più appropriato FYI. Si dovrebbe sempre usare l'inferenza del tipo su casting di tipo esplicito. Questo è documentato in numerose aree del libro Swift che Apple ha fornito ed è stato considerato la migliore pratica durante le note chiave del WWDC. – TheCodingArt

+2

TheCodingArt: questa è la tua opinione, non un fatto.In realtà, il tuo voto negativo e il commento sono fuorvianti e francamente irresponsabili. L'output compilato di utilizzare l'inferenza di tipo e il casting di tipo esplicito è identico. Vedi: http://stackoverflow.com/questions/24588893/swift-explicit-vs-inferred-typing-performance I, per esempio, preferisco la leggibilità del mio codice su ciò che hai postato, ma anche quello, come il tuo, è solo un'opinione –

+0

Ciò che ho affermato non è un fatto. Un'opinione non è formata da raccomandazioni fornite direttamente da Apple che sono documentate in numerose aree, ma un'ipotesi è fatta assumendo che io sia colui che ti ha votato. Se desideri saperne di più sulle appropriate API Swift consigliate e sulle linee guida generali sull'utilizzo, Apple ha fornito molte risorse pubblicamente disponibili come riferimento. Consiglierei davvero di chiarire i fatti e di verificare le linee guida di Apple, piuttosto che seguire i tuoi stili preferiti personali. – TheCodingArt

8

Swift 3:

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

Usa:

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

O

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) 
    } 
} 
Problemi correlati