85

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

知道 swift 项目中是否存在类别吗?或者如何在 swift 项目中实现类似的功能?

4

4 回答 4

129

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

它们在几个方面与 Objective-C 类别不同,主要是:

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

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

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

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

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

有关如何在 Swift 中使用 Extensions 的更多信息,请查看Apple 的文档。

于 2014-06-10T14:31:09.517 回答
103

在 Objective C 中它们被称为类别,但在 Swift 中它们被称为扩展。它们的目的都是为现有类提供额外的功能,而无需创建子类。

我在文档中阅读了有关扩展的信息,但直到我观看了本教程视频YouTube 版本github 源),我才真正了解如何在我的项目中使用扩展。

这是从视频中摘录的关于如何做到这一点的摘要。

将 Swift 文件添加到您的项目中

  • 右键单击项目导航器并选择“新建文件...”

  • 选择“快速文件”

  • 约定是将文件名保存为您正在扩展的类名加上(带有“+”号)您正在对其执行的操作。例如,“UIImage+裁剪”。

为扩展编写代码

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

如果您要UIKit扩展. 然后在要扩展的类名之前使用关键字。然后,您可以将自己的新方法添加到类中。(注意,扩展用于添加新方法,而不是覆盖现有方法——因此得名。)FoundationUIViewextension

在视频中,示例是添加一种方法,从图像中裁剪出一个圆圈并给它一个边框。

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,但正如您所见,它的使用方式与以前一样。

进一步研究:

于 2015-06-24T12:18:36.940 回答
8

在 Swift 中,它被称为Extensions一探究竟

于 2014-06-10T13:54:42.653 回答
0

您可以在现有课程中使用以下代码

extension name{
func funcName(){
   } 
}
于 2016-03-28T13:47:34.653 回答