如何创建用于类别的Swift类?

88

我想为我的现有 Swift 类创建一个类别,但是 IDE 中没有此选项。

有没有关于在 Swift 项目中使用类别的建议?或者如何在 Swift 项目中实现类似的功能?


2
它被称为“扩展”。 - holex
4个回答

131

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

它们与Objective-C的分类不同,主要表现在:

  • 它们没有名称
  • 您不需要显式导入扩展。如果您定义一个扩展来为现有类型添加新功能,则即使在定义扩展之前创建了实例,新功能也将在该类型的所有现有实例上可用。
  • 正如上面所述,它们不仅适用于类,还适用于其他类型。

截至今天,扩展可以:

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

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

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

查看Apple的文档了解如何在Swift中使用扩展。


104
在Objective C中,它们被称为类别,但在Swift中,它们被称为扩展。它们的目的都是为现有类提供额外的功能,而无需创建子类。
我已经在文档中阅读了关于扩展的内容,但直到我观看了这个教程视频YouTube版本github源代码),我才真正理解如何在我的项目中使用它。
以下是从视频中摘录的总结。

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

  • 在项目导航器中右键并选择“新建文件…”

  • 选择“Swift文件”

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

编写扩展的代码

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

如果您正在扩展UIView,则应导入UIKit(而不是Foundation)。然后在要扩展的类名之前使用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 的标准部分,但是你可以看到,它的使用方式就像是标准部分一样。

进一步学习:


7

1
但是 extension 不能包含变量,这使得事情完全不同。 - RnMss
即使在 Objective-C 中,分类也不能有变量(除非使用 hack)。 - Valentin Shergin
ObjC关联对象并不是黑客技巧。 - malhal

0
你可以在现有类中使用以下代码。
extension name{
func funcName(){
   } 
}

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