自动将Swift 3中的CGRectMake更新为CGRect

54

现在在Swift 3.0中已经删除了CGRectMake、CGPointMake、CGSizeMake等函数,是否有任何方法可以自动更新所有的初始化,例如从CGRectMake(0,0,w,h)CGRect(x:0,y:0,width:w,height:h)。手动处理相当繁琐。

不知道为什么苹果不会在将代码转换为当前Swift语法时自动转换它们...


3
"Convert to Current Swift Syntax(转换至当前的 Swift 语法)" 对我来说行得通,它将把 CGRectMake(0,0,w,h) 转换为 CGRect(x: 0,y: 0,width: w,height: h)。如果在您的情况下无效,则应提交错误报告。 - Martin R
3个回答

79

最简单的解决方案可能就是重新定义苹果取走的这些功能所对应的函数。例如:

func CGRectMake(_ x: CGFloat, _ y: CGFloat, _ width: CGFloat, _ height: CGFloat) -> CGRect {
    return CGRect(x: x, y: y, width: width, height: height)
}

把这个放到你的模块中,所有对CGRectMake的调用都会再次有效。


哦,那很酷!让我看看别人怎么想;否则,我会接受你的答案! - yonasstephen
我一直在等待PaintCode更新到Swift 3。由于其中有许多CGRectMake,这无疑是最好的解决方案。 - D. Greg
为什么有一个CGRectMake,如果你可以用CGRect初始化相同的方式,我不明白。 - thibaut noah
以前有 CGRectMake,因为苹果公司还没有完善将 Core Graphics 导入到 Swift 中的方式。现在他们已经做到了,所以 CGRectMake 在当前的 Swift 版本中不可用。 - rob mayoff
Obj-C的人们正在苦苦迁移到Swift :-) 那个解决方案是快速而肮脏的。我会用它进行快速移植。但如果你正在使用Swift,最好只使用这种范例。一开始看起来并不像那么糟糕。如果我真的被标签困扰了,我会制作一个扩展。这就是你习惯的方式。在我的职业生涯中,我一直在简洁/简洁与长/标记之间反复切换,它们都有优点。总体而言,标签使代码更易于维护和逆向工程,因为过了一段时间后,你会忘记,并且必须查找每个函数才能确定未命名的参数,这很麻烦。 - clearlight

32

简短回答:不要这样做。不要让苹果左右你。我讨厌CGRect(x:y:width:height:)。我已经在上面提交了一个错误报告。我认为初始化器应该是CGRect(_:_:_:_:),就像CGRectMake一样。我定义了一个CGRect的扩展程序来提供它,并在我开始时将该扩展程序放入每个项目中。

extension CGRect {
    init(_ x:CGFloat, _ y:CGFloat, _ w:CGFloat, _ h:CGFloat) {
        self.init(x:x, y:y, width:w, height:h)
    }
}

那样的话,我只需要在所有地方将“CGRectMake”更改为“CGRect”,然后就完成了。


1
感谢您提供这个非常有用的答案,您节省了我的时间。 - Sourabh Sharma
我应该在哪里添加这个扩展?或者说,我该如何使用它?谢谢。 - nights
1
@nights,在任何类之外 - Toma

19

苹果实际上提供了这个功能。您只需要执行以下操作:

编辑 > 转换 > 到最新的Swift语法...

输入图像描述

然后按照屏幕提示操作即可。

这将解决您的语法问题,您无需为所有已删除的函数创建新函数。


1
它确实是这样的!由于某些原因,当我第一次转换时,有些文件没有被转换。但是当我再次运行时,它成功了!我猜必须多次运行直到所有文件都被转换。 - yonasstephen
它对我不起作用,我尝试了不止一次,甚至在做了一些更改后仍然无效。 - nights

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