在协议继承中使用泛型类在归档应用程序时出现分段错误11错误
问题描述:
我有一个通用的基类我的应用程序。基本通用类需要一个协议才能将消息发送回控制器。在协议继承中使用泛型类在归档应用程序时出现分段错误11错误
一切工作正常,但一旦我尝试归档应用程序,我得到分段故障:11的编译器错误
我在SWIFT相当新的,因为我从.NET来了,所以可能是别的东西,我错过了,但我没有找到有关该问题的任何答案了
下面是代码我怎么能重现问题
class BaseClass{
@objc func myFunction(){
}
}
class ClassA<T : ProtocolA> : BaseClass{
var delegate: T?
override func myFunction(){
super.myFunction()
self.delegate?.funcA?()
}
}
class ClassB : ClassA<ProtocolB>{
override func myFunction() {
super.myFunction()
self.delegate?.funcB?()
}
}
@objc protocol ProtocolA{
@objc optional func funcA()
}
@objc protocol ProtocolB : ProtocolA{
@objc optional func funcB()
}
正如我看到的问题是周围的泛型类型代表变量在ClassA的,但是如果super.myFunction()调用在ClassB的代码构建注释掉正确
我注意到其他的事情,如果我设置的优化级别从快速,整个模块优化到无那么我也可以成功存档
更新1
我简化了代码多一点并且还我想出如果我使用的类,而不是协议作为通用参数编译器可以优化代码和如预期
更新2 这里是编译消息
工作0 swift 0x0000000104ae7dba PrintStackTraceSignalHandler(void*) + 42
1 swift 0x0000000104ae71f6 SignalHandler(int) + 662
2 libsystem_platform.dylib 0x00007fff7b8a8f5a _sigtramp + 26
3 libsystem_platform.dylib 0x00007ffeee8182e8 _sigtramp + 1928786856
4 swift 0x00000001014b4ca8 swift::irgen::CallEmission::emitToExplosion(swift::irgen::Explosion&) + 456
5 swift 0x0000000101613aca (anonymous namespace)::IRGenSILFunction::visitFullApplySite(swift::FullApplySite) + 3290
6 swift 0x00000001015f2a80 swift::irgen::IRGenModule::emitSILFunction(swift::SILFunction*) + 9152
7 swift 0x00000001014fd4be swift::irgen::IRGenerator::emitGlobalTopLevel() + 1022
8 swift 0x00000001015d28c5 swift::performIRGeneration(swift::IRGenOptions&, swift::ModuleDecl*, std::__1::unique_ptr<swift::SILModule, std::__1::default_delete<swift::SILModule> >, llvm::StringRef, llvm::LLVMContext&, llvm::GlobalVariable**) + 1589
9 swift 0x000000010145b26a performCompile(swift::CompilerInstance&, swift::CompilerInvocation&, llvm::ArrayRef<char const*>, int&, swift::FrontendObserver*, swift::UnifiedStatsReporter*) + 17018
10 swift 0x0000000101455784 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 7716
11 swift 0x000000010140a6a8 main + 12248
12 libdyld.dylib 0x00007fff7b628145 start + 1
13 libdyld.dylib 0x0000000000000048 start + 2224914180
的错误信息是:
1. While emitting IR SIL function "@_T012BugReproduce6ClassBC10myFunctionyyF".
for 'myFunction()' at /Users/pal.wagner/sources/playgrounds/BugReproduce/BugReproduce/Imps.swift:20:14
谢谢!
答
好吧,最后我得到了这个工作。
当我在玩弄我删除了所有不必要的(至少对我来说)部分从代码时,我得到了以下错误
Using 'ProtocolB' as a concrete type conforming to protocol 'ProtocolA' is not supported
这是代码
import Foundation
class BaseClass{
@objc func myFunction(){
}
}
class ClassA<T : ProtocolA> : BaseClass{
var delegate: T?
override func myFunction(){
super.myFunction()
self.delegate?.funcA()
}
}
class ClassB: ClassA<ProtocolB>{
}
protocol ProtocolA{
func funcA()
}
protocol ProtocolB : ProtocolA{
func funcB()
}
所以问题似乎有关基类没有类型的泛型类型????? - WTH。
然后我尝试用下面的方法,这是工作将类声明:
进口基金会
class BaseClass{
@objc func myFunction(){
}
}
class ClassA<T : ProtocolA> : BaseClass{
var delegate: T?
override func myFunction(){
super.myFunction()
self.delegate?.funcA?()
}
}
class ClassB<T: ProtocolB>: ClassA<T>{
override func myFunction() {
super.myFunction()
self.delegate?.funcB?()
}
}
@objc protocol ProtocolA{
@objc optional func funcA()
}
@objc protocol ProtocolB : ProtocolA{
@objc optional func funcB()
}
所以答案是,在这种情况下,你可以继承方式如下:
class ClassB<T: ProtocolB>: ClassA<T>
无论如何,当优化开启或编译出错时,编译器可以给出更好的错误信息