协议扩展未生效 (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
以满足您的需求。
截至撰写此问题时,我正在使用 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
以满足您的需求。