我想创建我现有的swift类的类别,但是IDE中没有选择这样做的选项。
知道在快速项目中是否存在类别?还是如何在Swift项目中实现类似的功能?
Answers:
在Swift中,您可以用来Extensions
向现有的类,结构和枚举类型添加新功能。
它们在一些方面与Objective-C类别有所不同,主要是:
就目前而言,扩展程序可以:
声明扩展的基本语法如下:
extension SomeType {
// new functionality to add to SomeType goes here
}
有关如何在Swift中使用扩展的更多信息,请查阅Apple的文档。
在Objective C中,它们称为类别,而在Swift中,它们称为扩展。两者的目的都是在不创建子类的情况下为现有类提供其他功能。
我已经阅读了文档中的扩展,但是直到观看完本教程视频(YouTube版本,github源代码),我才真正理解如何在我的项目中使用扩展。
这是从视频中摘录的摘要。
右键单击Project Navigator,然后选择“ New File ...”
选择“快速文件”
约定是将文件名另存为要扩展的类名,再加上对它的操作(带有“ +”号)。例如,“ UIImage + Cropping”。
打开刚刚创建的新Swift文件。
如果要扩展,则应导入UIKit
(而不是Foundation
)UIView
。然后extension
,在要扩展的类名之前使用关键字。然后,您可以将自己的新方法添加到类中。(注意,扩展名是用于添加新方法,而不是覆盖现有方法,因此使用了该名称。)
在视频中,示例是添加一种方法,该方法可以从图像中裁剪出一个圆圈并为其指定边框。
import UIKit
extension UIImage {
func cropToCircleWithBorderColor(color: UIColor, lineWidth: CGFloat) -> UIImage {
// code to create the cropped circle with colored border
return newImage
}
}
完整示例参见此处。
现在,您可以在代码中的任何地方对该类使用新方法,就像它是标准类的一部分一样。
这是视频的示例(在github上):
import UIKit
class ViewController: UIViewController {
@IBOutlet var imageView : UIImageView = nil
override func viewDidLoad() {
super.viewDidLoad()
let img = imageView.image
imageView.image = img.cropToCircleWithBorderColor(UIColor(red:0.91, green:0.34, blue:0.16, alpha:1.00), lineWidth: 20)
}
}
该方法cropToCircleWithBorderColor
不是的标准部分UIImage
,但是正如您所看到的,它的用法与以前一样。
extension
。