簡體   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