2017-10-05 107 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> 

無論如何,當優化開啓或編譯出錯時,編譯器可以給出更好的錯誤信息