swift 中的函数是否类似于 Android 中的 R.java?

Is any function in swift similar to R.java in Android?

我是 iOS 和 swift 的初学者。

我曾经写过 Android,我认为 R.java 是管理 id、drawable、字符串和其他资源的好主意。 所以我很惊讶 iOS 没有提供很好的访问资源的功能。

如果我想从资产中获取图像,我会调用 UIImage(named: "img_name"),但我认为这不是访问 img_name 的最佳方式,我可能会使用错误的名称并且我无法获取图像。

我发现了一些像 Shark and SwiftGen 这样的开源项目,但是 Shark 只支持图像并且 SwiftGen 似乎需要 运行 一个命令而不是自动。

你有更好的解决办法吗?谢谢!

  • 如果你使用的是InterfaceBuilder(也叫Storyboardxib),就没有必要为每个视图都定义id。您可以在代码中 bind 出口。

  • 如果您想使用视图的 ID 检索视图(如您所问的 R.java),您可以为每个视图设置标签并在代码中操作它们。

与 AndroidStudio 不同,Xcode 不会 生成任何文件。

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

Xcode本身没有这样的功能,但是有一个开源项目可以做到这一点:R.swift

它会自动更新生成的文件并支持许多不同的资源类型,例如图像、字体、segues 等等。

您可以通过使用扩展和枚举获得类似的功能。

使用枚举可以避免拼写错误并从 Xcode 的 autosuggest/autocomplete.

中受益

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

这些只是演示概念的示例,您可以进一步了解它。

我有一个开源项目 R.swift-plugin it provides features as you mentioned. You just need to install the Xcode Plugin via Alcatraz 并搜索 R.swift

该插件会自动生成一个资源文件来管理您的图像、可本地化的字符串和颜色,您可以像使用 R.java

一样访问它们

用法:

诚挚推荐您尝试一下。并随时给我任何改进建议:)