Swift extension的妙用
2020-08-05 本文已影响0人
啧啧同学
1.简单介绍extension
在Swift中扩展可以:
- 添加计算实例属性和计算类型属性;
- 定义实例方法和类型方法;
- 提供新构造器;
- 定义下标;
- 定义和使用新的嵌套类型;
- 使现有类型符合协议;
注意:
1.扩展可以向类型添加新功能,但不能覆盖现有功能。2. 扩展可以添加新的计算属性,但它们不能添加存储属性,或向现有属性添加属性观察者。
语法
extension SomeType {
// new functionality to add to SomeType goes here
}
应用
1.字体拓展
先看一下拓展后的🌰:
let label = UILabel()
/* 13 号 PingFangSC-Light 字体 */
label.font = UIFont.pfLight(ofSize: 13.0)
/* 10 号 PingFangSC-Regular 字体 */
label.font = UIFont.pfRegular(10.0)
/* 12 号 PingFangSC-Medium 字体 */
label.font = UIFont.pfMedium(12.0)
/* 13 号 PingFangSC-Semibold 字体 */
label.font = UIFont.pfSemibold(ofSize: 13.0)
具体实现的代码
extension UIFont {
enum FontName {
case pingfang, pingfangLight, pingfangMedium, pingfangSemibold
var name: String {
switch self {
case .pingfang:
return "PingFangSC-Regular"
case .pingfangLight:
return "PingFangSC-Light"
case .pingfangMedium:
return "PingFangSC-Medium"
case .pingfangSemibold:
return "PingFangSC-Semibold"
}
}
}
class func pfRegular(_ fontSize: CGFloat) -> UIFont {
let font = UIFont.font(type: .pingfang, fontSize: fontSize)
return font
}
class func pfLight(_ fontSize: CGFloat) -> UIFont {
let font = UIFont.font(type: .pingfangLight, fontSize: fontSize)
return font
}
class func pfMedium(_ fontSize: CGFloat) -> UIFont {
let font = UIFont.font(type: .pingfangMedium, fontSize: fontSize)
return font
}
class func pfSemibold(_ fontSize: CGFloat) -> UIFont {
let font = UIFont.font(type: .pingfangSemibold, fontSize: fontSize)
return font
}
class func font(type: FontName, fontSize size: CGFloat) -> UIFont {
guard let font = UIFont(name: type.name, size: size) else {
return .systemFont(ofSize: size)
}
return font
}
}
2.图片拓展
//颜色初始化图片
extension UIImage {
@objc
public static func from(color: UIColor) -> UIImage? {
let rect = CGRect(x: 0, y: 0, width: 1, height: 1)
UIGraphicsBeginImageContext(rect.size)
guard let context = UIGraphicsGetCurrentContext() else { return nil }
context.setFillColor(color.cgColor)
context.fill(rect)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}