【问题标题】:How to create swift class for category?如何为类别创建快速类?
【发布时间】:2014-07-31 07:47:16
【问题描述】:

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

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

【问题讨论】:

  • 它叫extension

标签: swift swift-extensions


【解决方案1】:

在 Swift 中它被称为 ExtensionsCheck it out

【讨论】:

  • 但是extensions 不能包含变量,这会使事情完全不同。
  • 即使在 Objective-C 类别中也不能有变量(没有 hacks)。
  • ObjC 关联对象不是 hacks
【解决方案2】:

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

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

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

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

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

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

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

查看Apple's documentation 了解有关如何在 Swift 中使用扩展的更多信息。

【讨论】:

    【解决方案3】:

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

    我在文档中阅读了有关扩展的信息,但直到看到this tutorial videoYouTube versiongithub source),我才真正了解如何在我的项目中使用扩展。

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

    将 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
        }
    }
    

    完整示例请参见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 的标准部分,但正如您所见,它的使用方式与以前一样。

    进一步研究:

    【讨论】:

      【解决方案4】:

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

      extension name{
      func funcName(){
         } 
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-24
        • 2015-10-21
        • 2020-11-18
        • 1970-01-01
        • 2020-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多