Swift3 ZeroMQ消息编译器的快速方便初始化器

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

我在Docker容器中使用Swift 3和ZeroMQ,我想通过扩展向ZeroMQ.Message添加几个方便的初始化器。我目前遇到的问题是使编译器崩溃:

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)
    }
}