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.
Nun, Scheiße. =/Immer saugt, um gültige Swift zu sehen, die Compilerfehler verursachen. – Alexander
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
@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. –