Является ли какая-нибудь функция быстрой, похожей на R.java в Android?

Я начинаю работать в iOS и быстро.

Раньше я писал Android, и я думаю, что R.java - хорошая идея управлять идентификаторами, чертежами, строками и другими ресурсами. Поэтому я удивлен, что iOS не обеспечивает хорошую функцию для доступа к ресурсам.

Если я хочу получить изображение из активов, я вызываю UIImage(named: "img_name"), но я не думаю, что это лучший способ получить доступ к img_name, я могу использовать неправильное имя, и я не могу получить изображение.

Я нашел проект с открытым исходным кодом, например Shark и SwiftGen, но Shark поддерживает только изображения и SwiftGen, кажется, что нужно выполнить команду не автоматически.

Есть ли у вас лучшее решение? Спасибо!

Ответ 1

У меня есть проект с открытым исходным кодом R.swift-plugin он предоставляет функции, как вы упомянули. Вам просто нужно установить плагин Xcode через Alcatraz и искать R.swift

Плагин автоматически создаст файл ресурсов для управления вашими изображениями, локализуемыми строками и цветами, и вы сможете получить к ним доступ, например, используя R.java

Использование:

введите описание изображения здесь

Искренне рекомендуем вам попробовать. И не стесняйтесь предлагать мне какое-либо предложение улучшить его:)

Ответ 2

  • Если вы используете InterfaceBuilder (также называемый Storyboard, xib), нет необходимости определять идентификатор для каждого представления. Вы можете привязать выходы в коде.

  • Если вы хотите получать представления с помощью своих идентификаторов (например, R.java по вашему запросу), вы можете установить тег для каждого представления и манипулировать ими в коде. введите описание изображения здесь

В отличие от AndroidStudio, Xcode будет не генерировать любой файл.

func viewDidLoad() {
    let labelView = self.view.viewWithTag(0) as? UILabel
}

Ответ 3

В Xcode нет такой функции, но есть проект с открытым исходным кодом, который выполняет только это: R.swift

Он автоматически обновляет сгенерированный файл и поддерживает множество различных типов ресурсов, таких как изображения, шрифты, segues и т.д.

Ответ 4

У вас могут быть аналогичные функции, используя расширения и перечисления.

Использование перечислений позволяет избежать опечаток и извлечь выгоду из автосохранения Xcode/автозаполнения.

Пример для UIImage:

extension UIImage {

    enum ImageId: String {
        // These are your images NAMES,
        // as in "SpriteMonster.jpg"
        case SpriteMonster, SpriteHero, BaseLandscape
    }

    convenience init!(id: ImageId) {
        self.init(named: id.rawValue)
    }
}

Использование:

let monster = UIImage(id: .SpriteMonster)  // the "SpriteMonster.jpg" image

В этом примере я принудительно разворачиваю удобство init, поэтому будьте осторожны, чтобы иметь изображение с правильным именем в вашем комплекте.

Для строки:

extension String {

    enum StringId: String {
        case Welcome = "Welcome to the game!"
        case GameOver = "You loose! Game over!"
    }

    init(id: StringId) {
        self = id.rawValue
    }

}

Использование:

let label = String(id: .Welcome) // "Welcome to the game!"

Для шрифтов:

extension UIFont {

    enum FontId {
        case HelveticaNeueLarge
        case HelveticaNeueMedium
        case HelveticaNeueSmall

        func font() -> UIFont {
            switch self {
            case .HelveticaNeueLarge:
                return UIFont(name: "HelveticaNeue", size: 18)!
            case .HelveticaNeueSmall:
                return UIFont(name: "HelveticaNeue", size: 12)!
            default:
                return UIFont(name: "HelveticaNeue", size: 14)!
            }
        }
    }

    class func get(id: FontId) -> UIFont {
        return id.font()
    }

}

Использование:

let font = UIFont.get(.HelveticaNeueLarge) // <UICTFont: 0x7ffd38f09180> font-family: "Helvetica Neue"; font-weight: normal; font-style: normal; font-size: 18.00pt

Это только примеры для демонстрации концепции, вы можете пойти гораздо дальше с этим.