在swift </protocol>中替换@protocol(<protocol name =“”>)

时间:2014-10-10 02:26:07

标签: swift objective-c-protocol

我想在swift中使用NSXPCConnection

所以,这一行:

_connectionToService = [[NSXPCConnection alloc] initWithServiceName:@"SampleXPC"];

可以替换为这一行:

_connectionToService = NSXPCConnection(serviceName: "SampleXPC")

而且,这一行:

_connectionToService.remoteObjectInterface = [NSXPCInterface interfaceWithProtocol:@protocol(StringModifing)];

可以替换为这一行:

_connectionToService.remoteObjectInterface = NSXPCInterface(protocol: <#Protocol#>)

现在我很担心在swift中使用正确的替换:<#Protocol#>,在目标c中我会使用:@protocol(StringModifing),但是在swift中我很无能:(

2 个答案:

答案 0 :(得分:0)

这是一个棘手的问题。

首先,协议是保留关键字,不能用作参数标签。快速浏览一下苹果官方文档对我有所帮助。改用`protocol``。这意味着参数名称包含单引号。

“[obj class]”在swift中被“obj.self”取代。协议使用相同的语法。这意味着在你的情况下“@protocol(StringModifing)”变成“StringModifing.self”。

不幸的是,这仍然行不通。现在问题出在幕后。 xpc机制是某种低级别的东西,需要ObjC样式协议。这意味着您需要在协议声明之前使用关键字@objc。

所有解决方案都是:

@objc protocol StringModifing {

    func yourProtocolFunction()
}

@objc protocol StringModifingResponse {

    func yourProtocolFunctionWhichIsBeingCalledHere()
}

@objc class YourXPCClass: NSObject, StringModifingResponse, NSXPCListenerDelegate {

    var xpcConnection:NSXPCConnection!
    private func initXpcComponent() {

        // Create a connection to our fetch-service and ask it to download for us.
        let fetchServiceConnection = NSXPCConnection(serviceName: "com.company.product.xpcservicename")

        // The fetch-service will implement the 'remote' protocol.
        fetchServiceConnection.remoteObjectInterface = NSXPCInterface(`protocol`: StringModifing.self)


        // This object will implement the 'StringModifingResponse' protocol, so the Fetcher can report progress back and we can display it to the user.
        fetchServiceConnection.exportedInterface = NSXPCInterface(`protocol`: StringModifingResponse.self)
        fetchServiceConnection.exportedObject = self

        self.xpcConnection = fetchServiceConnection

        fetchServiceConnection.resume()

        // and now start the service by calling the first function
        fetchServiceConnection.remoteObjectProxy.yourProtocolFunction()
    }

    func yourProtocolFunctionWhichIsBeingCalledHere() {

        // This function is being called remotely
    }
}

答案 1 :(得分:0)

雨燕4

_connectionToService.remoteObjectInterface = NSXPCInterface(with: StringModifing.self)