今天,当我试图“通用化”我的“ CoreData导入操作”时遇到了一个奇怪的问题。看来,如果我创建NSOperation的通用子类,main()则不会调用该func。
main()
简单的例子:
class MyOperation<T: NSObject>: NSOperation { override func main() { println("My operation main was called") } }
如果您创建此类的实例并将其添加到中,operationQueue您将看到main()实际上并没有调用它。
operationQueue
override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. self.operationQueue = NSOperationQueue() let operation = MyOperation<NSString>() self.operationQueue!.addOperation(operation) }
操作简单地从过境ready到executing和finished状态,而无需调用main()。
ready
executing
finished
如果我<T: NSObject>从MyOperation类中删除通用注释,它将正常工作。
<T: NSObject>
MyOperation
这怎么可能?我在这里想念什么吗?
问题是由以下简单规则引起的:
通用类中的方法无法在Objective-C中表示
结果,当桥接到Objective-C时,它MyOperation看起来像是纯的,没有方法被覆盖,是NSOperation子类。
NSOperation
您可以通过标记看到这个错误override func main()与@objc属性。
override func main()
@objc
@objc override func main() { // < [!] Method in a generic class cannot be represented in Objective-C println("My operation main was called") }