書いたコード
protocol Test { var x: CGFloat { get set } var y: CGFloat { get set } func setPoint(point: CGPoint) } extension Test { mutating func setPoint(point: CGPoint) { x = point.x y = point.y } } struct test: Test { var x: CGFloat = 0.0 var y: CGFloat = 0.0 }
出るエラー
ビルドはできないし、Xcodeのシンタックスハイライトも死んで白き灰がちになりてわろし。
0 swift 0x0000000105b9b33b llvm::sys::PrintStackTrace(__sFILE*) + 43 1 swift 0x0000000105b9ba7b SignalHandler(int) + 379 2 libsystem_platform.dylib 0x00007fff81b9752a _sigtramp + 26 3 libsystem_platform.dylib 0x00007fff5bf79768 _sigtramp + 3661505112 4 swift 0x0000000103e64857 swift::SILWitnessVisitor<(anonymous namespace)::SILGenConformance>::visitProtocolDecl(swift::ProtocolDecl*) + 999 5 swift 0x0000000103e62035 swift::Lowering::SILGenModule::getWitnessTable(swift::ProtocolConformance*) + 277 6 swift 0x0000000103eb1890 (anonymous namespace)::SILGenType::emitType() + 1264 7 swift 0x0000000103eb132e swift::Lowering::SILGenModule::visitNominalTypeDecl(swift::NominalTypeDecl*) + 30 8 swift 0x0000000103e39e0b swift::Lowering::SILGenModule::emitSourceFile(swift::SourceFile*, unsigned int) + 779 9 swift 0x0000000103e3a9c0 swift::SILModule::constructSIL(swift::ModuleDecl*, swift::SILOptions&, swift::FileUnit*, llvm::Optional<unsigned int>, bool, bool) + 928 10 swift 0x0000000103e3ad6d swift::performSILGeneration(swift::FileUnit&, swift::SILOptions&, llvm::Optional<unsigned int>, bool) + 109 11 swift 0x0000000103c8eb92 performCompile(swift::CompilerInstance&, swift::CompilerInvocation&, llvm::ArrayRef<char const*>, int&) + 11442 12 swift 0x0000000103c8bcd3 frontend_main(llvm::ArrayRef<char const*>, char const*, void*) + 2691 13 swift 0x0000000103c88354 main + 2324 14 libdyld.dylib 0x00007fff844be5ad start + 1 Command failed due to signal: Segmentetion fault: 11
とか出る。
解決法
protocolにちゃんとmutating
をつける。
protocol Test { var x: CGFloat { get set } var y: CGFloat { get set } mutating func setPoint(point: CGPoint) } extension Test { mutating func setPoint(point: CGPoint) { x = point.x y = point.y } } struct test: Test { var x: CGFloat = 0.0 var y: CGFloat = 0.0 }
たったこれだけなんだけど全然分からなくて、最強のアルバイト氏に相談したら見つかった。さすが最強である。