我想创建现有swift类的类别,但IDE中没有选项可以这样做。
知道swift项目中是否存在类别?或者如何在swift项目中实现类似的功能?
答案 0 :(得分:125)
在Swift中,您可以使用Extensions
向现有类,结构和枚举类型添加新功能。
它们在几个方面与Objective-C类别不同,主要是:
现在,Extensions可以:
声明扩展名的基本语法如下:
extension SomeType {
// new functionality to add to SomeType goes here
}
检查Apple's documentation以获取有关如何在Swift中使用扩展程序的更多信息。
答案 1 :(得分:99)
在Objective C中,它们被称为categories,但在Swift中它们被称为extensions。它们的目的是为现有类提供附加功能,而无需创建子类。
我已经阅读了文档中的扩展程序,但在我看到this tutorial video(YouTube version,github source)之前,我并不真正了解如何在项目中使用扩展程序。
以下是有关如何操作的视频摘要。
右键单击Project Navigator并选择“New File ...”
选择“Swift文件”
惯例是将文件名保存为您要扩展的类名(加上“+”符号),以便对其进行操作。例如,“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
}
}
有关完整示例,请参阅here。
现在,您可以在代码中的任何位置使用新方法,就像它是标准类的一部分一样。
以下是视频的示例(on 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
的标准部分,但正如您所看到的,它的使用方式就像它一样。
答案 2 :(得分:8)
在Swift中,它被称为扩展! Check it out
答案 3 :(得分:0)
您可以在现有班级中使用以下代码
extension name{
func funcName(){
}
}