为什么swift同时提供CGRect初始化器和CGRectMake函数?

时间:2016-01-11 09:10:40

标签: swift function design-patterns constructor

当我在swift中学习Core Graphics时,我在youtube上观看的教程使用CGRectMake函数而不是CGRect的初始化函数来创建CGRect实例。

这对我来说太奇怪了。我不明白为什么我应该使用前者,因为参数是相同的,我认为使用XXXMake函数没有性能优势。

另外,为什么当CGRect已经有一个具有完全相同参数的初始化程序时,swift甚至还有这样的“Make”功能?我认为模块的开发人员正在使用我不知道的某种设计模式。他们用过一个吗?如果是,那是什么?我真的想知道一些更多的设计模式。

1 个答案:

答案 0 :(得分:20)

简短回答: CGRectMake不是“由Swift提供”。 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编译器自动导入所有函数 基础头文件(如果它们是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中找到。