如何使用Objective-c扩展中嵌套的Swift类型?

问题描述 投票:0回答:2

我本质上是希望UIColor的枚举被哪个团队使用它们打破。希望它可以轻松访问。类似于:

[UIColor.Residential.whiteUIColor.Commercial.white

困难在于找到可以在Swift和Objective-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中访问有组织的静态变量,而不必每次都调用一个方法。如果不可能,我将按照另一个问题的说明去做。我只想知道是否。

谢谢!

objective-c swift
2个回答
1
投票

除非您在目标C语言中使用Swift枚举,否则它们必须声明整数原始类型,以便遵守您的规范,并且在两种语言之间都可用,否则将难以满足您的要求。您将必须为包含RGB Int value的每种颜色创建一个枚举,然后将其用于每个仅接受其关联枚举中的颜色的类颜色的类函数。然后,这些函数调用一个函数从int解压RGB值,然后将其用于创建并返回UIColor

由于Swift和Obj-C之间枚举的互操作性限制,目前无法将颜色保留为十六进制字符串并在两种语言之间使用枚举的要求。

@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

编辑:

this SO answer找到并修改了用于创建UIColor的Int到RGB代码。


0
投票

因此,以下工作:

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


-1
投票

enum扩展名中创建structUIColor并在其中添加颜色

extension UIColor {
    enum Test {
        static var myColor: UIColor { UIColor(named: "color")! }
    }
}

您可以这样称呼它UIColor.Test.myColor

© www.soinside.com 2019 - 2024. All rights reserved.