为什么Swift提供CGRect初始化器和CGRectMake函数?

12

在学习 Swift 中的 Core Graphics 时,我看到的 YouTube 教程使用 CGRectMake 函数而不是 CGRect 的初始化器来创建一个 CGRect 实例。

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

此外,为什么 Swift 甚至有这样的“Make”函数,当 CGRect 已经有一个带有完全相同参数的初始化器了?我认为模块的开发人员正在使用某种设计模式,但我不知道他们是否采用了一种特定的设计模式。如果是这样,它是什么?我真的想了解更多的设计模式。

1个回答

21
< p > 简短回答: 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编译器会自动导入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的初始化程序更具“Swift风格”,并且使用显式参数标签表达更清晰:

let rect = CGRect(x: x, y: x, width: w, height: h)

更新:Swift 3/Xcode 8 开始,CGRectMake 在 Swift 中已不再可用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接