Как использовать тип Swift, вложенный в расширение в target- c? - PullRequest
0 голосов
/ 10 января 2020

Я, по сути, хочу, чтобы перечисление UIColor было разбито, какая команда будет их использовать. Надежда состоит в том, что к нему можно было легко получить доступ. Что-то вроде:

UIColor.Residential.white или UIColor.Commercial.white

Сложность в том, чтобы найти что-то, что работает как в Swift, так и в Objective- C. Попытка всякого рода @ obj c и @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")

}

Редактировать

Другой вопрос, на который я ссылался, рекомендует вызывать методы класса для вычисления цветов из гекса. Но это переменные состояния c, которые не нужно вычислять при вызове. Да, снижение производительности незначительно, но я хотел бы получить доступ к организованным переменным stati c в Swift и Obj C без вызова метода каждый раз. Если это невозможно, я сделаю то, что говорит другой вопрос. Я просто хочу знать, если это так.

Спасибо!

Ответы [ 2 ]

1 голос
/ 10 января 2020

Итак, работает следующее:

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 голос
/ 10 января 2020

Вы не можете использовать Swift-перечисления в Objective- C, если они не объявляют целочисленный необработанный тип, поэтому, чтобы придерживаться ваших спецификаций и быть доступными между обоими языками, становится сложным достигать того, о чем вы просите. Вам нужно будет создать перечисление для каждого набора цветов, содержащее значение RGB Int , которое затем используется в функции класса для каждого типа цвета, который принимает цвета только в пределах своего связанного перечисления. Затем эти функции вызывают функцию для распаковки значения RGB из int, которое затем используется для создания и возврата 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

Редактировать:

Int в RGB код, использованный для создания UIColor, был найден и изменен с этого SO ответа .

...