ios - 如何使用其父类(super class)的实例初始化我的子类?

标签 ios swift casting subclassing eventkit

在我的应用程序中,我读取了 EKEvent 类型的日历事件,并且我使用大量计算变量进行了扩展,因此我可以轻松地获取日历中每个事件的持续时间、工时数等。但是在大规模情况下,性能很差 - 所以我想改用惰性变量来缓存我所有的额外数据。

因此,我想创建一个 EKEvent 的子类 - 称为 CustomEvent,它添加了惰性变量,但我的问题是 EKEventStore 总是返回 EKEvents,我需要将其转换为我的 CustomEvent 子类的实例,以便能够访问惰性变量等。

简单的类型转换是不够的,我已经在 Playground 上尝试过,看看有什么用,但没有任何用处。我需要一个 CustomRectangle 的特殊构造函数,它可以从 NativeRectangle 初始化 CustomRectangle。另一种解决方案是制作一个包装类,将原始对象作为属性保存,但这不是我最喜欢的解决方案,因为我必须映射所有方法和属性

class NativeRectangle: NSObject {
    var width: Int
    var height: Int

    init(width: Int, height: Int) {
        self.width = width
        self.height = height
        super.init()
    }
}

class CustomRectangle: NativeRectangle {
    var area: Int { return width * height}
}

let rect = NativeRectangle(width: 100, height: 20)

let customRect = CustomRectangle(rect) // This fails, i need a constructor

print(customRect.area)

最佳答案

在创建子类实例时,在 Swift 中(通常在大多数面向对象语言中)无法使用基类对象的现有实例。

从一般编程的角度来看,在这种情况下您有两种选择:

  1. 使用组合:使 CustomRectangle 包含一个 NativeRectangle 并将您需要的所有方法转发给它。

  2. 使用 map 将 NativeRectangles 链接到其他信息。在 Objective C 和 Swift 中,您可以使用 objc_AssociationPolicy 来最轻松地拥有这样的内部映射。参见 https://stackoverflow.com/a/43056053/278842

顺便说一句。将一个简单的计算“缓存”为 width * height,您将无法看到任何加速。

关于ios - 如何使用其父类(super class)的实例初始化我的子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45894237/

相关文章:

ios - 消除 Swift 中 UITableView 中空行的额外分隔线

iphone - 在 cocos2d 2.1 项目中实现 Game Center

ios - SwiftUI Map 不以注释为中心

ios - CLLocation 跟踪 iPhone 在哪条路上

ios - 如何在 iPhone 中使用 libxml2 解析 xml

ios - Swift 通用回调

c++ - reinterpret_cast< > 从一个结构到另一个

generics - 带有数组的 Swift countElements()

.net - 装箱/拆箱和类型转换有什么区别?

ios - App Store Connect 验证时出现 bundle 标识符 "org.cocoapods.device-id"错误