[英]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.