How to access extension of UIColor in SWIFT?

僤鯓⒐⒋嵵緔 提交于 2019-11-28 09:44:47

You have defined an instance method, which means that you can call it only on an UIColor instance:

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

The compiler error "missing argument" occurs because Instance Methods are Curried Functions in Swift, so it could equivalently be called as

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

(But that would be a strange thing to do, and I have added it only to explain where the error message comes from.)


But what you really want is a type method (class func)

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

which is called as

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

without the need to create an UIColor instance first.

With Swift 3, predefined UIColors are used accordingly:

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

Therefore, if you want something similar, such as the following...

var myColor: UIColor = .myCustomColor

...then, you would define the extension like so:

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

In fact, Apple defines white as:

public class var white: UIColor

Swift 3, Swift 4:

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

Use:

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

Or

self.view.backgroundColor = .myBlue

You just need to change your statement like,

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

More detailed explanation is here.

i89

You defined a instance function. It means you need an instance of UIColor in case to use getCustomBlueColor()-method.

It looks like you want to have a class method, instead of the instance method. So you have to change your definition like this:

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

Note the 'class' before func, so the method is now accessible as a class method.

The same story using class methods in a structure:

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

If you just want to have a class with some color definitions, I recommend you to use a struct over a class or extension:

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

Could use a computed property:

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

And then to call it:

UIColor().customBlueColor

Swift:

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

Get the this extension for customize type UIView

extension UIColor {
    // Method returns a custom color
    static func rgb(red: CGFloat, green: CGFloat, blue: CGFloat) -> UIColor {
        return .init(red: blue / 255, green: green / 255, blue: blue / 255, alpha: 1.0)
    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!