我本质上想要一个UIColor
的枚举,打破它的团队将使用它们。希望它可以很容易地访问。类似于:
UIColor.Residential.white
或UIColor.Commercial.white
困难在于找到一个既适用于Swift,又适用于客观的东西-C。在扩展和类声明前面尝试各种形式的@objc和@objMembers使我感到困惑。有这种东西的图案吗?
像下面这样的东西将是理想的。
extension UIColor {
@objc class Residential {
static let navbarBlue = UIColor.color(hexString: "003865")
}
@objc class Commercial {
static let navbarBlue = UIColor.color(hexString: "010101")
}
}
现在,我正在使用下面的内容,它运行得很好,但我不喜欢重复命名。
extension UIColor {
@objc static let residentialDarkBlueNavBar = UIColor.color(hexString: "003865")
@objc static let commercialLightBlueNavBar = UIColor.color(hexString: "0B60BB")
@objc static let residentialBackgroundNavBar = UIColor.color(hexString: "0E49AD")
@objc static let commercialBackgroundGray = UIColor.color(hexString: "F2F2F6")
}
编辑
我所提到的另一个问题是,建议调用类方法来计算十六进制的颜色。但是,这些是静态变量,在调用时不需要计算。是的,性能影响可以忽略不计,但是我想访问Swift和ObjC中的有组织的静态变量,而不每次调用一个方法。如果不可能,我会照另一个问题说的做。我只想知道是不是。
谢谢!
发布于 2020-01-10 09:52:54
你不能在Objective中使用Swift枚举,除非它们声明一个整数原始类型,这样才能遵守您的规范,并且在两种语言之间都可用,实现您所要求的就变得复杂了。您必须为包含RGB Int值的每一组颜色创建一个枚举,然后在每个颜色类型的类函数中使用该类函数,这些颜色类型只接受与其关联的枚举中的颜色。然后,这些函数调用一个函数,从int中解压RGB值,然后使用int来创建和返回UIColor
。
由于Swift和Obj之间对枚举的互操作性限制,要求将颜色保持为十六进制字符串并在两种语言之间使用枚举是不可能的。
@objc public enum Residential: NSInteger {
case darkBlue = 14437
}
@objc public enum Commercial: NSInteger {
case lightBlue = 745659
}
extension UIColor {
@objc static func commercial(_ rgb: Commercial) -> UIColor {
return UIColor.rgb(rgb.rawValue)
}
@objc static func residential(_ rgb: Residential) -> UIColor {
return UIColor.rgb(rgb.rawValue)
}
@objc class func rgb(_ rgb: Int) -> UIColor {
let iBlue = rgb & 0xFF
let iGreen = (rgb >> 8) & 0xFF
let iRed = (rgb >> 16) & 0xFF
let iAlpha = (rgb >> 24) & 0xFF
return UIColor.init(red: CGFloat(iRed)/255, green: CGFloat(iGreen)/255,
blue: CGFloat(iBlue)/255, alpha: CGFloat(iAlpha)/255)
}
}
使用情况:
let residentialBlue = UIColor.residential(.darkBlue) // Swift useage
UIColor *residentialBlue = [UIColor residential:ResidentialBlue]; // Obj-C useage
编辑:
用于创建UIColor的Int代码是从这就是答案中找到和修改的。
发布于 2020-01-10 10:27:12
因此,以下工作:
extension UIColor {
@objc(UIColorResidential) public class Residential: NSObject {
@objc static let navbarBlue = UIColor.color(hexString: "003865")
}
@objc(UIColorCommercial) public class Commercial: NSObject {
@objc static let navbarBlue = UIColor.color(hexString: "010101")
}
}
不要忘记正确导入它们:@class UIColorResidential, UIColorCommercial;
在.h
中,#import "YourModule-Swift.h"
在.m
中
https://stackoverflow.com/questions/59685241
复制相似问题