如何为类别创建swift类?


84

我想创建我现有的swift类的类别,但是IDE中没有选择这样做的选项。

知道在快速项目中是否存在类别?还是如何在Swift项目中实现类似的功能?


2
它叫extension
Holex 2014年

Answers:


128

在Swift中,您可以用来Extensions向现有的类,结构和枚举类型添加新功能。

它们在一些方面与Objective-C类别有所不同,主要是:

  • 他们没有名字
  • 您不需要显式导入扩展。如果定义扩展以将新功能添加到现有类型,则新功能将在该类型的所有现有实例上可用,即使它们是在定义扩展之前创建的。
  • 如上所述,它们不仅适用于类,而且适用于其他类型。

就目前而言,扩展程序可以:

  • 添加计算的属性和计算的静态属性
  • 定义实例方法和类型方法
  • 提供新的初始化器
  • 定义下标
  • 定义和使用新的嵌套类型
  • 使现有类型符合协议

声明扩展的基本语法如下:

extension SomeType {
    // new functionality to add to SomeType goes here
}

有关如何在Swift中使用扩展的更多信息,请查阅Apple的文档


99

在Objective C中,它们称为类别,而在Swift中,它们称为扩展。两者的目的都是在不创建子类的情况下为现有类提供其他功能。

我已经阅读了文档中的扩展,但是直到观看完本教程视频YouTube版本github源代码),我才真正理解如何在我的项目中使用扩展。

这是从视频中摘录的摘要。

将Swift文件添加到您的项目

  • 右键单击Project Navigator,然后选择“ New File ...”

  • 选择“快速文件”

  • 约定是将文件名另存为要扩展的类名,再加上对它的操作(带有“ +”号)。例如,“ UIImage + Cropping”。

编写扩展代码

打开刚刚创建的新Swift文件。

如果要扩展,则应导入UIKit(而不是FoundationUIView。然后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,但是正如您所看到的,它的用法与以前一样。

进一步研究:



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.