协议扩展未生效 (Swift)

Protocol extensions are not in effect (Swift)

截至撰写此问题时,我正在使用 Swift 2.1 和 Xcode 7.2.1。

下面的代码(用于对 struct 进行编码)不起作用,并使 Xcode 操场崩溃而没有错误。在项目中,导致编译时出现segmentation fault

protocol StructCoding {
    typealias structType

    func encode() -> NSData

    static func decode(data: NSData) -> Self
}

extension StructCoding {

    mutating func encode() -> NSData {
        return withUnsafePointer(&self) { p in
            NSData(bytes: p, length: sizeofValue(self))
        }
    }

    static func decode(data: NSData) -> structType {
        let pointer = UnsafeMutablePointer<structType>.alloc(sizeof(structType))
        data.getBytes(pointer, length: sizeof(structType))
        return pointer.move()
    }
}

struct testStruct: StructCoding {
    let a = "dsd"
    let b = "dad"
    typealias structType = testStruct
}

但这些可以工作。

struct testStruct: StructCoding {
    let a = "dsd"
    let b = "dad"

    mutating func encode() -> NSData {
        return withUnsafePointer(&self) { p in
            NSData(bytes: p, length: sizeofValue(self))
        }
    }

    static func decode(data: NSData) -> testStruct {
        let pointer = UnsafeMutablePointer<testStruct>.alloc(sizeof(testStruct))
        data.getBytes(pointer, length: sizeof(testStruct))
        return pointer.move()
    }

}

var s1 = testStruct()
let data = s1.encode()
let s2 = testStruct.decode(data)

答案: 问题是您将 encode 声明为非变异函数,但是将其实现为变异函数(在提供的代码中) ).

encode 的声明(在协议中)从 func encode() -> NSData 更改为 mutating func encode() -> NSData 以满足您的需求。