【问题标题】:Subclass NSMutableData in SwiftSwift 中的 NSMutableData 子类
【发布时间】:2015-10-13 15:01:52
【问题描述】:

我正在尝试在 Swift 中创建一个名为 ServiceProviderDataNSMutableData 的子类,它将接收两个 NSData 实例,进行一些解析(在下面的示例中过于简化)以创建一个新的 NSData 实例,然后我想打电话给super.init(data: data)

尝试使用下面的代码来实现这一点给了我:

由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'***初始化方法-initWithBytes:length:copy:deallocator:无法发送到类Example.ServiceProviderData的抽象对象:创建一个具体实例!'

我读到NSData/NSMutableDataclass cluster 的一部分,所以我的问题是我必须实现哪些方法/属性以及如何快速执行此操作?

class ServiceProviderData: NSMutableData {
    init?(originalResponseData: NSData, identityProviderResponseData: NSData) {

        // Here I'm just appending the two datas but this has 
        // been greatly simplified for demonstrative purposes...

        let data = NSMutableData(data: originalResponseData)
        data.appendData(identityProviderResponseData)

        super.init(data: data)
    }

    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

【问题讨论】:

  • 你真的需要一个 NSMutableData 子类吗?你不能在一个扩展或一个单独的类中做吗?
  • @e1985 我可以,但现在我的好奇心已经占据了,所以我很想看看如何实现它
  • 好的,下面关于对类集群进行子类化的答案可能对他们有所帮助。我只是想指出在这种情况下子类化不是一个好主意,即使 NSMutableData 不是类集群。

标签: ios xcode swift ios9


【解决方案1】:

不要认为有任何理由这样做

恕我直言,您应该只让类 WRAP 一个数据对象

但是

关于类集群: https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaEncyclopedia/ClassClusters/ClassClusters.html

您在类集群中创建的新类必须:

  • 成为集群抽象超类的子类
  • 声明自己的存储
  • 覆盖超类的所有初始化方法
  • 覆盖超类的原始方法(如下所述)

对于 NSData,原始方法是 byteslength

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多