2017-10-05 106 views
0

我有一个通用的基类我的应用程序。基本通用类需要一个协议才能将消息发送回控制器。在协议继承中使用泛型类在归档应用程序时出现分段错误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 

谢谢!

回答

0

好吧,最后我得到了这个工作。

当我在玩弄我删除了所有不必要的(至少对我来说)部分从代码时,我得到了以下错误

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> 

无论如何,当优化开启或编译出错时,编译器可以给出更好的错误信息