Generics 泛型NSOperation子类失去NSOperation功能
今天,我在尝试“概括”我的“CoreData导入操作”时遇到了一个奇怪的问题。 似乎如果我创建一个NSOperation的泛型子类,Generics 泛型NSOperation子类失去NSOperation功能,generics,swift,nsoperation,nsoperationqueue,Generics,Swift,Nsoperation,Nsoperationqueue,今天,我在尝试“概括”我的“CoreData导入操作”时遇到了一个奇怪的问题。 似乎如果我创建一个NSOperation的泛型子类,main()func将不会被调用 简单的例子: class MyOperation<T: NSObject>: NSOperation { override func main() { println("My operation main was called") } } 操作只需从ready转换到executing和
main()
func将不会被调用
简单的例子:
class MyOperation<T: NSObject>: NSOperation {
override func main() {
println("My operation main was called")
}
}
操作只需从ready
转换到executing
和finished
状态,无需调用main()
如果我从MyOperation
类中删除泛型注释
,它将正常工作
这怎么可能?
我在这里遗漏了什么吗?问题是由以下简单规则引起的: 泛型类中的方法不能在Objective-C中表示 因此,当桥接到Objective-C时,
MyOperation
看起来像纯的,没有方法被重写,NSOperation
子类
通过使用@objc
属性标记override func main()
,可以看到此错误
@objc override func main() { // < [!] Method in a generic class cannot be represented in Objective-C
println("My operation main was called")
}
无法在Objective-C中表示泛型类中的@objc override func main(){/<[!]方法
println(“调用了我的主操作”)
}
解决方法:您可以创建NSOperation子类(非泛型),重写main并调用您自己的“execute”func,它可以被泛型子类重写。
例如:
类快捷操作:NSOperation{
最终覆盖函数main(){
执行()
}
func execute(){
}
}
类操作:快速操作{
重写func execute(){
println(“调用了我的主操作”)
}
}
在Xcode 7中,通用NSO操作已修复:如果我在操场上运行此代码,它将正常工作:
protocol SomeProtocol {
// markup protocol
}
class GenericOperation<SomeTypeImplementingProtocol: SomeProtocol>: NSOperation {
let referenceToSomeTypeImplementingProtocol: SomeTypeImplementingProtocol
init(referenceToSomeTypeImplementingProtocol: SomeTypeImplementingProtocol) {
self.referenceToSomeTypeImplementingProtocol = referenceToSomeTypeImplementingProtocol
}
override func main() {
debugPrint("The GenericOperation main() method was called.")
}
}
class TypeImplementingSomeProtocol: SomeProtocol {
init() {
}
}
let operationQueue = NSOperationQueue()
let typeImplementingSomeProtocolInstance = TypeImplementingSomeProtocol()
let operation = GenericOperation<TypeImplementingSomeProtocol>(referenceToSomeTypeImplementingProtocol: typeImplementingSomeProtocolInstance)
operationQueue.addOperation(operation)
protocol-SomeProtocol{
//标记协议
}
类GenericOperation:NSOperation{
让我们参考SomeTypeImplementingProtocol:SomeTypeImplementingProtocol
init(referenceToSomeTypeImplementingProtocol:SomeTypeImplementingProtocol){
self.referencetosometypeemplementingprotocol=referencetosometypeemplementingprotocol
}
重写func main(){
debugPrint(“调用了GenericOperation main()方法”)
}
}
类类型实现SomeProtocol:SomeProtocol{
init(){
}
}
让operationQueue=NSOperationQueue()
让typeImplementingSomeProtocolInstance=TypeImplementingSomeProtocol()
let operation=GenericOperation(参考ToSoMetypeImplementingProtocol:typeImplementingSomeProtocolInstance)
operationQueue.addOperation(操作)
感谢您的澄清。遗憾的是,我们不能在Swift中使用Objective-C这样强大的技术。在这种特殊情况下,“广义”操作可以帮助重用相当多的代码束。嗯,是的/太棒了,谢谢!对于UIKit代表也非常有用!我使用这个方法来实现一个通用的tableViewDataSource
class SwiftOperation : NSOperation {
final override func main() {
execute()
}
func execute() {
}
}
class MyOperation<T> : SwiftOperation {
override func execute() {
println("My operation main was called")
}
}
protocol SomeProtocol {
// markup protocol
}
class GenericOperation<SomeTypeImplementingProtocol: SomeProtocol>: NSOperation {
let referenceToSomeTypeImplementingProtocol: SomeTypeImplementingProtocol
init(referenceToSomeTypeImplementingProtocol: SomeTypeImplementingProtocol) {
self.referenceToSomeTypeImplementingProtocol = referenceToSomeTypeImplementingProtocol
}
override func main() {
debugPrint("The GenericOperation main() method was called.")
}
}
class TypeImplementingSomeProtocol: SomeProtocol {
init() {
}
}
let operationQueue = NSOperationQueue()
let typeImplementingSomeProtocolInstance = TypeImplementingSomeProtocol()
let operation = GenericOperation<TypeImplementingSomeProtocol>(referenceToSomeTypeImplementingProtocol: typeImplementingSomeProtocolInstance)
operationQueue.addOperation(operation)