読者です 読者をやめる 読者になる 読者になる

文字っぽいの。

文字を書いています。写真も混ざります。

Swift2.0のprotocol extension試してたら'Segmentetion fault: 11'でてハマった。

書いたコード

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
}

たったこれだけなんだけど全然分からなくて、最強のアルバイト氏に相談したら見つかった。さすが最強である。