当我在swift中学习Core Graphics时,我在youtube上观看的教程使用CGRectMake
函数而不是初始化器CGRect
来创建CGRect
实例.
这对我来说太奇怪了.我不明白为什么我应该使用前者,因为参数是相同的,我认为使用该XXXMake
功能没有性能优势.
另外,为什么swift甚至具有这样的"Make"功能,当CGRect
已经有一个具有完全相同参数的初始化器时?我认为模块的开发人员正在使用我不知道的某种设计模式.他们用过一个吗?如果是,那是什么?我真的想知道一些更多的设计模式.
简答: CGRectMake
不是"斯威夫特提供的".CoreGraphics框架中相应的C函数会自动导入,因此可以在Swift中使用.
更长的答案: CGRectMake在CoreGraphics框架的"CGGeometry.h"中定义为
CG_INLINE CGRect CGRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height) { CGRect rect; rect.origin.x = x; rect.origin.y = y; rect.size.width = width; rect.size.height = height; return rect; }
在(Objective-)C中,该函数提供了一种初始化CGRect
变量的便捷方法:
CGRect r = CGRectMake(x, y, h, w);
Swift编译器自动从Foundation头文件中导入所有函数(如果它们与Swift兼容),因此将其导入为
public func CGRectMake(x: CGFloat, _ y: CGFloat, _ width: CGFloat, _ height: CGFloat) -> CGRect
您可以使用那个,也可以使用其中一个Swift初始化程序
public init(origin: CGPoint, size: CGSize) public init(x: CGFloat, y: CGFloat, width: CGFloat, height: CGFloat) public init(x: Double, y: Double, width: Double, height: Double) public init(x: Int, y: Int, width: Int, height: Int)
我不认为它会产生任何性能差异.许多人可能会使用CGRectMake()
它,因为他们已经习惯了从Swift之前的旧时代开始.使用显式参数标签,Swift初始化器更"流畅"且更具表现力:
let rect = CGRect(x: x, y: x, width: w, height: h)
更新:从Swift 3/Xcode 8开始, CGRectMake
Swift中不再提供.