swift中的任何功能是不是类似于Android中的R.java?

Posted

技术标签:

【中文标题】swift中的任何功能是不是类似于Android中的R.java?【英文标题】:Is any function in swift similar to R.java in Android?swift中的任何功能是否类似于Android中的R.java? 【发布时间】:2016-08-08 07:03:53 【问题描述】:

我是 ios 初学者,速度很快。

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

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

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

您有更好的解决方案吗?谢谢!

【问题讨论】:

【参考方案1】:

我有一个开源项目R.swift-plugin,它提供了您提到的功能。您只需要通过Alcatraz 安装Xcode Plugin 并搜索R.swift

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

用法:

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

【讨论】:

它看起来绝对是我想要的!但只支持字符串、图像、颜色。反正我会试试的。 是的,我认为字符串、图像和颜色应该是最常见的资源。 但是我打算以后让它支持 id(reuseidentifier, segue), layout(nib), bool, dimen 和 integer!我真的希望这个插件会有所帮助。 请注意,虽然这个“R.swift-plugin”使用了一个非常相似的名称,但它与R.swift 工具无关。【参考方案2】:

如果您使用InterfaceBuilder(也称为Storyboardxib),则无需为每个视图定义id。您可以在代码中bind outlets。

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

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

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

【讨论】:

谢谢。但它只支持 ids 和 layouts 对吧?有没有管理图像、颜色或字符串的功能? 将图像添加到 Xcode 中的 Assets 文件夹。通常,只需添加 3 倍图像即可正确显示和缩放。 UIImage(named: "hello") 将从Assets 检索名为hello 的图像。 可以,但是使用图片名称初始化可能会因为错字而失败 @FindleyTyler 是的,你是对的。但是,在 Swift 中有一个特殊的泛型类型,叫做Optional。默认情况下,所有类型和类都是 nil “不兼容的”。这意味着,您不能将 nil 分配为值并且编译代码会失败。 Optional 使它们可分配,因此您的应用程序不会崩溃,除非您强制解开它们。这里有更多信息。 ***.com/a/24026093/3815843 另外,UIImageView 的属性image 的类型为UIImage?,这意味着Optional<UIImage>。您可以将nil 分配给image,视图将不会呈现任何内容。因此,如果您希望看到一些图像,但您没有看到任何内容,则可能是您打错了【参考方案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

对于这个例子,我强制解开便利初始化,所以要小心在你的包中实际使用正确名称的图像。

对于字符串:

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

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

【讨论】:

以上是关于swift中的任何功能是不是类似于Android中的R.java?的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 中显示与 Android 中的 Toast 具有相同功能的消息

iOS中是不是有任何方法可以从Detail View浏览Core Data对象,类似于“Notes”应用程序的功能

Swift 3:如何为类似于进度条的视图背景颜色设置动画

javascript中是不是有类似于php中的compact的功能?

解压缩来自服务器的 zip 文件,而不在 ios swift 中本地保存,类似于 android 的操作?

➽06闭包