将嵌套枚举作为参数传递
Passing a nested enum as a parameter
我想不出一种方法来从便利初始化中的嵌套枚举中检索原始值。 fontName.rawValue
将不起作用,因为 Custom
没有案例。有什么建议吗?
extension UIFont {
enum Custom {
enum Roboto: String {
case Regular = "RobotoRegular"
}
enum SanFrancisco: String {
case Semibold = "SFSemibold"
}
}
convenience init?(name fontName: Custom, size fontSize: CGFloat) {
self.init(name: fontName.rawValue, size: fontSize)
}
}
// Example Usage
UIFont(name: .Roboto.Regular, size: 18)
我有一个稍微不同的方法供您使用,但可以让使用字体变得同样简单。首先,您需要为您的字体枚举创建一个协议,然后是一个提供默认方法的扩展,如下所示:
protocol CustomFontsProtocol {
var fontName: String { get }
}
extension CustomFontsProtocol {
func size(size: CGFloat) -> UIFont {
return UIFont(name: fontName, size: size)!
}
}
现在,对于您的枚举,您可以像这样创建它:
enum CustomFonts {
enum Roboto: CustomFontsProtocol {
case Regular
var fontName: String {
switch self {
case Regular: return "RobotoRegular"
}
}
}
enum SanFrancisco: CustomFontsProtocol {
case Semibold
var fontName: String {
switch self {
case Semibold: return "SFSemibold"
}
}
}
}
这将允许您这样调用您的字体:
CustomFonts.SanFrancisco.Semibold.size(18)
这是最简单的替代实现:
protocol CustomFontsProtocol {
func size(size: CGFloat) -> UIFont?
}
extension CustomFontsProtocol where Self: RawRepresentable, Self.RawValue == String {
func size(size: CGFloat) -> UIFont? {
return UIFont(name: rawValue, size: size)
}
}
enum CustomFonts {
enum Roboto: String, FontConvertible {
case Regular = "RobotoRegular"
}
enum SanFrancisco: String, FontConvertible {
case Semibold = "SFSemibold"
}
}
// Example Usage
CustomFonts.SanFrancisco.Semibold.size(18)
我想不出一种方法来从便利初始化中的嵌套枚举中检索原始值。 fontName.rawValue
将不起作用,因为 Custom
没有案例。有什么建议吗?
extension UIFont {
enum Custom {
enum Roboto: String {
case Regular = "RobotoRegular"
}
enum SanFrancisco: String {
case Semibold = "SFSemibold"
}
}
convenience init?(name fontName: Custom, size fontSize: CGFloat) {
self.init(name: fontName.rawValue, size: fontSize)
}
}
// Example Usage
UIFont(name: .Roboto.Regular, size: 18)
我有一个稍微不同的方法供您使用,但可以让使用字体变得同样简单。首先,您需要为您的字体枚举创建一个协议,然后是一个提供默认方法的扩展,如下所示:
protocol CustomFontsProtocol {
var fontName: String { get }
}
extension CustomFontsProtocol {
func size(size: CGFloat) -> UIFont {
return UIFont(name: fontName, size: size)!
}
}
现在,对于您的枚举,您可以像这样创建它:
enum CustomFonts {
enum Roboto: CustomFontsProtocol {
case Regular
var fontName: String {
switch self {
case Regular: return "RobotoRegular"
}
}
}
enum SanFrancisco: CustomFontsProtocol {
case Semibold
var fontName: String {
switch self {
case Semibold: return "SFSemibold"
}
}
}
}
这将允许您这样调用您的字体:
CustomFonts.SanFrancisco.Semibold.size(18)
这是最简单的替代实现:
protocol CustomFontsProtocol {
func size(size: CGFloat) -> UIFont?
}
extension CustomFontsProtocol where Self: RawRepresentable, Self.RawValue == String {
func size(size: CGFloat) -> UIFont? {
return UIFont(name: rawValue, size: size)
}
}
enum CustomFonts {
enum Roboto: String, FontConvertible {
case Regular = "RobotoRegular"
}
enum SanFrancisco: String, FontConvertible {
case Semibold = "SFSemibold"
}
}
// Example Usage
CustomFonts.SanFrancisco.Semibold.size(18)