gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 05:34:40 25 4
gpt4 key购买 nike

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

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

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

最佳答案

简短回答: 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() 因为他们从旧的 pre-Swift 就习惯了次。 Swift 初始化器更“敏捷”并且更具表现力显式参数标签:

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

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

关于swift - 为什么 swift 同时提供 CGRect 初始化器和 CGRectMake 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34717650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com