将嵌套枚举作为参数传递

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)