Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 泛型NSOperation子类失去NSOperation功能_Generics_Swift_Nsoperation_Nsoperationqueue - Fatal编程技术网

Generics 泛型NSOperation子类失去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和

今天,我在尝试“概括”我的“CoreData导入操作”时遇到了一个奇怪的问题。 似乎如果我创建一个NSOperation的泛型子类,
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)