在swift中优雅的扩展CGRect
swift 给我我们iOS开发者很多惊喜, 基本上用过swift就觉得,就不想再用OC了,多了不解释
OC中CGRect用法
其实这里可以用省略一万字来写 ,但还是扯一扯。。。
这是OC里面的写法,
self.frame = CGRectMake(0b10, 1.09, 22.0f, 0x222);
无论你是 ,整数二进制还是十六进制还是多少进制,都可以帮你隐式转出CGFloat
{char, uchar, short, ushort}->int-> uint->long->ulong->float->double
也就是 这段代码在OC是编译运行是没有问题的
char c = 'c';
int j = 0 + c;
float k = j + 1.0f;
double d = k + 1.0;
这些都属于基本数据类型,OC 睁一只眼闭一只眼
swift中CGRect用法
在swift里面很多东西发生了变化
@frozen public struct CGFloat {
}
@frozen public struct Int{
}
@frozen public struct Double{
}
基本数据类型都变成了封装类了,这个就很尴尬了。
更可气的是
CGRect的构造方法,要么都传整,要么都传浮点,要么滚蛋
假如我就要这么写,而且还不能让他出错 ,这个时候就需要对Rect扩展了,具体怎么扩展 ,上代码
import UIKit
public protocol BasicDataType {
}
extension Int: BasicDataType {
}
extension UInt: BasicDataType {
}
extension Float: BasicDataType {
}
extension Double: BasicDataType {
}
extension CGFloat: BasicDataType {
}
extension BasicDataType {
internal var fvalue: CGFloat {
let offset: CGFloat
if let amount = self as? Float {
offset = CGFloat(amount)
} else if let amount = self as? Double {
offset = CGFloat(amount)
} else if let amount = self as? CGFloat {
offset = CGFloat(amount)
} else if let amount = self as? Int {
offset = CGFloat(amount)
} else if let amount = self as? UInt {
offset = CGFloat(amount)
} else {
offset = 0.0
}
return offset
}
}
extension CGRect {
init(_ x:BasicDataType , _ y:BasicDataType, _ width:BasicDataType , _ height: BasicDataType){
self.init(x: x.fvalue, y: y.fvalue, width: width.fvalue, height: height.fvalue)
}
}
优雅的使用,深藏功与名
let rect = CGRect(1.0, 0x3, 3.3, 333)