2016-10-28 7 views
2

Die Situation:Behelfslösung für bestimmten generischen Typparameter

Ich habe zwei Protokolle, eines mit einer statischen Methode:

protocol DataSourceable { 
    static func getMoreData<T: DataAccepting>(someObject: T) 
} 

protocol DataAccepting { 
    func accept(data: [Any]) 
} 
extension DataAccepting where Self: UIViewController { } 

der fein kompiliert.

Einmal definiere ich eine Klasse mit einem Parameter vom Typ DataSourceable entsprechen:

class SampleViewController<T: DataSourceable>: UIViewController {...}

ich ein Segmentation Fault: 11 und die Compiler-Abstürze erhalten.

0 swift     0x0000000112445b6d PrintStackTraceSignalHandler(void*) + 45 
    1 swift     0x00000001124455b6 SignalHandler(int) + 470 
    2 libsystem_platform.dylib 0x00007fffa4bd9bba _sigtramp + 26 
    3 libsystem_platform.dylib 0x0000000000000002 _sigtramp + 1531077730 
    4 swift     0x000000010f8bd5bd swift::irgen::emitCategoryData(swift::irgen::IRGenModule&, swift::ExtensionDecl*) + 2285 
    5 swift     0x000000010f8c2425 swift::irgen::IRGenModule::emitGlobalDecl(swift::Decl*) + 1189 
    6 swift     0x000000010f8c1e85 swift::irgen::IRGenModule::emitSourceFile(swift::SourceFile&, unsigned int) + 133 
    7 swift     0x000000010f98dfe2 performIRGeneration(swift::IRGenOptions&, swift::ModuleDecl*, swift::SILModule*, llvm::StringRef, llvm::LLVMContext&, swift::SourceFile*, unsigned int) + 1282 
    8 swift     0x000000010f85c1c7 performCompile(swift::CompilerInstance&, swift::CompilerInvocation&, llvm::ArrayRef<char const*>, int&, swift::FrontendObserver*) + 23687 
    9 swift     0x000000010f854265 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 17029 
    10 swift     0x000000010f81182d main + 8685 
    11 libdyld.dylib   0x00007fffa49cd255 start + 1 
    12 libdyld.dylib   0x00000000000000c6 start + 1533226610 
    **More_Stuff**... 
    While emitting IR for source file /xx/xx/xx/xx/xx/xx/xx/SampleViewController.swift 

Das Endziel ist in der Lage sein, dies zu tun:

class SampleViewController<T: DataSourceable>: UIViewController, DataAccepting { 
var intArray = [Int]() 
    func setup() { 
     T.getMoreData(dataAcceptor: self) 
    } 

    func accept(data: [Any]) { 
     intArray = data 
    } 
} 

struct SampleModel: DataSourceable { 
    static func getMoreData<T: DataAccepting>(dataAcceptor: T) { 
     var anIntArray = [Int]() 
     someObject.accept(anIntArray) 
    } 
} 

Und dann ein SampleViewController<SampleModel> machen. Dadurch kann ich SampleModel mit Sourcing-Daten für den Controller beschäftigen. Das SampleModel entscheidet, wie die Daten abgerufen werden, und verwendet dann die Funktion accept() auf dem Controller, um die Daten an den SampleController zu übergeben.

+0

Nun, Scheiße. =/Immer saugt, um gültige Swift zu sehen, die Compilerfehler verursachen. – Alexander

+0

Obwohl, wenn Sie selbst als Parameter übergeben werden, warum machen Sie es zu einer statischen Methode in erster Linie? Sie können es nur eine Instanz-Methode mit einem Parameter machen, und rufen Sie 'self.someProtocolMethod (num: 0)' – Alexander

+0

@AlexanderMomchliov Hmm, ich bin mir nicht sicher, dass das das gleiche Verhalten erreichen würde. Grundsätzlich benötigt jeder Typ, der ProcotolA entspricht, eine Funktion, die ein Int und ein Objekt vom generischen Typ T akzeptieren kann. Lass mich meine Frage bearbeiten, um es etwas komplizierter zu machen;). Der Typ "T" in "someProtocolMethod()" hat ebenfalls eine Einschränkung. –

Antwort

1

Dies scheint ein Compilerfehler zu sein. Sie sollten diesen Entwurf jedoch im Allgemeinen vermeiden, wie wir in chat besprochen haben.

Verwandte Themen