如何在Swift中访问UIColor的扩展?

27
我正在尝试创建一个UIColor类的Swift扩展。
extension UIColor {
    
    func getCustomBlueColor() -> UIColor {
        return UIColor(red:0.043, green:0.576, blue:0.588, alpha:1.00)   
    }

}

在这之后,我以以下方式访问了该方法
btnShare.setTitleColor(UIColor.getCustomBlueColor(**UIColor**), forState: UIControlState.Normal)

我不知道我应该传递什么参数给这个语句。

2
你不需要传递任何参数,只需调用 UIColor.getCustomBlueColor() - tkanzakic
@tkanzakic,如果要像那样访问它,它不需要成为一个class func吗?- 用户示例需要像这样访问UIColor().getCustomBlueColor() - Wez
是的,我在想如何访问实例类型而不是类类型。 - user4790024
Swift Extension - Juan Boero
9个回答

49
你定义了一个实例方法,这意味着只能在 UIColor 实例上调用它:
let col = UIColor().getCustomBlueColor()
// or in your case:
btnShare.setTitleColor(UIColor().getCustomBlueColor(), forState: .Normal)

编译器错误“缺少参数”是由于在Swift中,实例方法是柯里化函数,因此可以等效地被称为。
let col = UIColor.getCustomBlueColor(UIColor())()

(但那样做很奇怪,我只是加上它来解释错误消息的来源。)

但实际上你需要的是一个 类型方法 (class func)

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

被称为

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

无需先创建UIColor实例。


谢谢马丁,现在我明白了...但是这个语句在Xcode 6.3上无法编译,让col = UIColor.getCustomBlueColor(UIColor())。 - user4790024
1
@copeME:目前我没有访问Xcode 6.3的权限,所以我只能稍后检查。但是我提到let col = UIColor.getCustomBlueColor(UIColor())只是为了解释编译器错误消息,这不是你实际应该做的。你真正应该使用class定义它作为一种类型方法。 - Martin R
是的,我一直在尝试访问实例方法时遇到了问题。谢谢马丁。 - user4790024
@copeME:你说得对,“柯里化函数示例”中有一个错误。 - Martin R

25

在 Swift 3 中,预定义的 UIColors 将被相应地使用:

var myColor: UIColor = .white // or .clear or whatever
因此,如果您想要类似的东西,比如以下内容...
var myColor: UIColor = .myCustomColor

...然后,您可以这样定义扩展:

extension UIColor {

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

}

事实上,苹果公司将白色定义为:

public class var white: UIColor

“var myColor = UIColor.myCustomColor” 更为合适,顺便提一下。你应该始终使用类型推断而不是显式类型转换。这在苹果提供的 Swift 书籍的许多区域中都有记录,并且在 WWDC 主题演讲期间被认为是最佳实践。 - TheCodingArt
3
TheCodingArt - 这是你的观点,不是事实。实际上,你的反对投票和评论是误导性的,而且说实话有些不负责任。使用类型推断和显式类型转换编译后的输出结果是相同的。参见:https://dev59.com/ymAf5IYBdhLWcg3weyzZ。就我而言,我更喜欢我的代码可读性,而不是你所发布的内容,但这也只是一个观点。 - Gene Loparco
我所陈述的是事实而非观点。观点并不是基于苹果公司在多个领域记录的直接提供的建议,而是通过假设我是那个给你投了反对票的人来形成的。如果您想了解有关适当推荐的Swift API和一般使用准则的更多信息,苹果公司已经提供了大量公开可用的参考资源。真的很建议您搞清楚事实,并检查一下苹果公司的指南,而不是遵循您个人喜好的风格。 - TheCodingArt
3
我已经查看了指南,没有发现苹果公司明确说明应该始终使用类型推断而不是显式类型转换的任何部分。我也没有看到任何关于为什么这样做更为合适的文章或解释。如果这是一个“最佳实践”,那么根据定义,它是一种观点,而不是事实。在我的最后一条评论中,我提供了一个链接,显示它们都编译成相同的输出。如果您提供了您所引用的内容的链接,那将会有所帮助。 - Gene Loparco
世纪最佳答案。谢谢。 - Sipho Koza
谢谢,虽然这有点言过其实了,不是吗?;-) - Gene Loparco

23

Swift 3,Swift 4,Swift 5:

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

使用:

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

或者

self.view.backgroundColor = .myBlue
如果您在*.xcassets(iOS11+)中使用颜色设置。例如,您有一个名为“appBlue”的颜色。那么:
extension UIColor {

private static func getColorForName(_ colorName: String) -> UIColor {
    UIColor(named: colorName) ?? UIColor.red
}

static var appBlue: UIColor {
    self.getColorForName("appBlue")
}
}

使用:

self.view.backgroundColor = .appBlue

3

获取此扩展程序以自定义类型为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)
    }
}

这与所问问题无关。 - undefined

2

您只需要将语句更改为以下内容:

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

更加详细的说明可以在这里找到。


1

你定义了一个实例函数。这意味着你需要一个UIColor的实例才能使用getCustomBlueColor()方法。

看起来你想要一个类方法,而不是实例方法。所以你需要像这样改变你的定义:

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

注意在func前面的'class',这样该方法现在可以作为类方法访问。
在结构体中使用类方法的同样故事:
struct MyColors{
    static func getCustomBlueColor() -> UIColor{
        return UIColor(red:0.043, green:0.576 ,blue:0.588 , alpha:1.00)
    }
}
let color = MyColors.getCustomBlueColor()

如果您只想拥有一些颜色定义的类,我建议您使用结构体而不是类或扩展:
struct MyColors{
    static var getCustomBlueColor = { return UIColor(red:0.043, green:0.576 ,blue:0.588 , alpha:1.00) }
}
let color = MyColors.getCustomBlueColor()

嗨,@Chuck。我已经格式化了你的答案。看看吧! - Keshav Kumar
感谢 :-) 我在stackoverflow上还很新,所以对于格式错误非常抱歉。 - i89

1

可以使用计算属性:

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

然后进行调用:

UIColor().customBlueColor

最好将其设置为static属性,这样就不需要创建一个临时的UIColor实例了。 - undefined

0

Swift:

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

0

UIColor扩展Swift 5

extension UIColor {
    static var yourColor:UIColor {
        return UIColor(red: 0.745, green: 0.157, blue: 0.074, alpha: 1)
    }
}

使用: view.backgroundColor = .yourColor

请不要发布重复的答案。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接