【问题标题】:Why does swift provide both a CGRect initializer and a CGRectMake function?为什么 swift 同时提供 CGRect 初始化器和 CGRectMake 函数?
【发布时间】:2016-01-11 09:10:40
【问题描述】:

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

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

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

【问题讨论】:

    标签: swift function design-patterns constructor


    【解决方案1】:

    简短回答: 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 中可用。

    【讨论】:

      猜你喜欢
      • 2016-11-15
      • 1970-01-01
      • 2020-10-28
      • 1970-01-01
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多