当前位置:  开发笔记 > IOS > 正文

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

如何解决《为什么swift同时提供CGRect初始化器和CGRectMake函数?》经验,为你挑选了1个好方法。

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

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

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



1> Martin R..:

简答: 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中不再提供.

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有