Swift3 ZeroMQ消息编译器的快速方便初始化器
我在Docker容器中使用Swift 3和ZeroMQ,我想通过扩展向ZeroMQ.Message添加几个方便的初始化器。我目前遇到的问题是使编译器崩溃:Swift3 ZeroMQ消息编译器的快速方便初始化器,swift3,zeromq,Swift3,Zeromq,我在Docker容器中使用Swift 3和ZeroMQ,我想通过扩展向ZeroMQ.Message添加几个方便的初始化器。我目前遇到的问题是使编译器崩溃: import Foundation import ZeroMQ import SwiftProtobuf extension ZeroMQ.Message { convenience init?(string: String, encoding: String.Encoding = .utf8) { var asDa
import Foundation
import ZeroMQ
import SwiftProtobuf
extension ZeroMQ.Message {
convenience init?(string: String, encoding: String.Encoding = .utf8) {
var asData = string.data(using:encoding)!
asData.withUnsafeBytes { (bytes: UnsafePointer<UInt8>) in
let unsafe = UnsafeMutableRawPointer.allocate(bytes: asData.count, alignedTo: 8)
unsafe.copyBytes(from: bytes, count: asData.count)
try? self.init(data: unsafe, size: asData.count)
}
}
convenience init?(protobuf: SwiftProtobuf.Message) {
guard let data = try? protobuf.serializedData() else {
return nil
}
data.withUnsafeBytes { (bytes: UnsafePointer<UInt8>) in
let unsafe = UnsafeMutableRawPointer.allocate(bytes: data.count, alignedTo: 8)
unsafe.copyBytes(from: bytes, count: data.count)
try? self.init(data: unsafe, size: data.count)
}
}
}
上述情况产生了一个我不理解的错误:
extensions.swift:41:17: error: 'self' used inside 'catch' block reachable from self.init call
convenience init?(string: String, encoding: String.Encoding = .utf8) {
将do{…}catch{…}
替换为一行程序可以满足编译器的要求,但在初始化器抛出时会泄漏缓冲区(在成功的情况下,ZeroMQ会获得内存的所有权):
事实证明,我对ZeroMQ API不熟悉,这意味着我走错了路,不必要地把事情复杂化了。ZeroMQ已经有一个方法封装
UnsafemtableBytes
特性:
public func send(_ data: Data, mode: SendMode = []) throws -> Bool
。。。因此,为了实现增加发送Protobufs的便利性的目标,我所需要做的就是向ZeroMQ的套接字
添加一个简单的扩展方法:
extension Socket {
func send(_ proto: SwiftProtobuf.Message, mode: SendMode = []) throws -> Bool {
let data = try proto.serializedData()
return try self.send(data, mode: mode)
}
}
try? self.init(data: unsafe, size: data.count)
public func send(_ data: Data, mode: SendMode = []) throws -> Bool
extension Socket {
func send(_ proto: SwiftProtobuf.Message, mode: SendMode = []) throws -> Bool {
let data = try proto.serializedData()
return try self.send(data, mode: mode)
}
}