swift项目定义字体的方法(便捷的方法)

首先我们为了书写方便,需要把常用的几种字体写成枚举类型的方式,比如这样

public enum XDFont: String {
    #if os(iOS){
        case pingFangSCUltralight = "PingFangSC-Ultralight"
        case pingFangSCRegular = "PingFangSC-Regular"
        case pingFangSCSemibold = "PingFangSC-Semibold"
        case pingFangSCThin = "PingFangSC-Thin"
        case pingFangSCLight = "PingFangSC-Light"
        case pingFangSCMedium = "PingFangSC-Medium"
      }
}

然后再写一个UIFont的类扩展

import UIKit

extension UIFont {
    /// Create a UIFont object with a `Font` enum
    public convenience init?(font: XDFont, size: CGFloat) {
        let fontIdentifier: String = font.rawValue
        self.init(name: fontIdentifier, size: size)
    }
}

使用的时候就可以这样用

let font = UIFont.init(font: XDFont.pingFangSCRegular, size: 15)

有没有很方便,免去手打字体名的烦恼了
作为爱折腾的我,心里想着一定有更简单的方法,那就是利用swift强大的协议扩展,进一步简化代码,这也是很swift的编程方式
具体步骤如下:
1.先声明一个名为FontRepresentable的协议,这个协议是继承自RawRepresentable的,顾名思义是一个用于枚举类型的扩展协议

import UIKit

public protocol FontRepresentable: RawRepresentable {}


2.然后把它扩展到String类型的枚举,联想到上面的String类型的枚举,很容易就想到第三步

extension FontRepresentable where Self.RawValue == String {
    public func of(size: CGFloat) -> UIFont? {
        return UIFont(name: rawValue, size: size)
    }

    public func of(size: Double) -> UIFont? {
        return UIFont(name: rawValue, size: CGFloat(size))
    }
}

3.接下来,我们定义的结构体类型需要实现这个协议

public enum XDFont: String, FontRepresentable{
       #if os(iOS){
        case pingFangSCUltralight = "PingFangSC-Ultralight"
        case pingFangSCRegular = "PingFangSC-Regular"
        case pingFangSCSemibold = "PingFangSC-Semibold"
        case pingFangSCThin = "PingFangSC-Thin"
        case pingFangSCLight = "PingFangSC-Light"
        case pingFangSCMedium = "PingFangSC-Medium"
      }
}

所以我们就能这样用

let font = XDFont.pingFangSCRegular.of(size: 15)

是不是就不用谢初始化代码了,也有代码提示了

你可能感兴趣的:(swift项目定义字体的方法(便捷的方法))