首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在objective中使用嵌套在扩展中的Swift类型?

如何在objective中使用嵌套在扩展中的Swift类型?
EN

Stack Overflow用户
提问于 2020-01-10 16:12:32
回答 2查看 367关注 0票数 0

我本质上想要一个UIColor的枚举,打破它的团队将使用它们。希望它可以很容易地访问。类似于:

UIColor.Residential.whiteUIColor.Commercial.white

困难在于找到一个既适用于Swift,又适用于客观的东西-C。在扩展和类声明前面尝试各种形式的@objc和@objMembers使我感到困惑。有这种东西的图案吗?

像下面这样的东西将是理想的。

代码语言:javascript
运行
复制
extension UIColor {

    @objc class Residential {
        static let navbarBlue = UIColor.color(hexString: "003865")
    }

    @objc class Commercial {
        static let navbarBlue = UIColor.color(hexString: "010101")
    }

}

现在,我正在使用下面的内容,它运行得很好,但我不喜欢重复命名。

代码语言:javascript
运行
复制
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中的有组织的静态变量,而不每次调用一个方法。如果不可能,我会照另一个问题说的做。我只想知道是不是。

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2020-01-10 17:52:54

你不能在Objective中使用Swift枚举,除非它们声明一个整数原始类型,这样才能遵守您的规范,并且在两种语言之间都可用,实现您所要求的就变得复杂了。您必须为包含RGB Int值的每一组颜色创建一个枚举,然后在每个颜色类型的类函数中使用该类函数,这些颜色类型只接受与其关联的枚举中的颜色。然后,这些函数调用一个函数,从int中解压RGB值,然后使用int来创建和返回UIColor

由于Swift和Obj之间对枚举的互操作性限制,要求将颜色保持为十六进制字符串并在两种语言之间使用枚举是不可能的。

代码语言:javascript
运行
复制
@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)

    }
}

使用情况:

代码语言:javascript
运行
复制
let residentialBlue = UIColor.residential(.darkBlue) // Swift useage

UIColor *residentialBlue = [UIColor residential:ResidentialBlue]; // Obj-C useage

编辑:

用于创建UIColor的Int代码是从这就是答案中找到和修改的。

票数 1
EN

Stack Overflow用户

发布于 2020-01-10 18:27:12

因此,以下工作:

代码语言:javascript
运行
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59685241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档