繁体   English   中英

协议扩展无效 (Swift)

[英]Protocol extensions are not in effect (Swift)

在撰写此问题时,我使用的是 Swift 2.1 和 Xcode 7.2.1。

下面的代码(用于编码struct )不起作用,并且使 Xcode playground 崩溃而不会出错。 在项目中时,会导致编译期间出现分段错误。

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以符合您的需求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM