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
(也叫Storyboard
、xib
),就没有必要为每个视图都定义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
一样访问它们
用法:
诚挚推荐您尝试一下。并随时给我任何改进建议:)
我是 iOS 和 swift 的初学者。
我曾经写过 Android,我认为 R.java 是管理 id、drawable、字符串和其他资源的好主意。 所以我很惊讶 iOS 没有提供很好的访问资源的功能。
如果我想从资产中获取图像,我会调用 UIImage(named: "img_name")
,但我认为这不是访问 img_name
的最佳方式,我可能会使用错误的名称并且我无法获取图像。
我发现了一些像 Shark and SwiftGen 这样的开源项目,但是 Shark
只支持图像并且 SwiftGen
似乎需要 运行 一个命令而不是自动。
你有更好的解决办法吗?谢谢!
如果你使用的是
InterfaceBuilder
(也叫Storyboard
、xib
),就没有必要为每个视图都定义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
一样访问它们用法:
诚挚推荐您尝试一下。并随时给我任何改进建议:)