2014-10-10 2 views
3

Я пытаюсь использовать NSXPCConnection в быстром.Замена @protocol (<имя протокола>) в swift

Таким образом, эта линия:

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

можно заменить на этой линии:

_connectionToService = NSXPCConnection(serviceName: "SampleXPC") 

И эта линия:

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

можно заменить на этой линии:

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

Теперь я запутался об использовании правильной замены для: <#Protocol#> в стрижа, в Objective C Я бы использовал: @protocol(StringModifing), но в стрижа я невежественный :(

+2

Try 'StringModifing.self'. – dasblinkenlight

ответ

0

Это хитрый.

Прежде всего протокол является зарезервированным ключевым словом и не может использоваться как метка параметра. Мне помог быстрый осмотр официального документа Яблока. вместо этого используйте `protocol``. Это означает, что имя параметра содержит одинарные кавычки.

"[obj class]" заменяется на "obj.self" в swift. Такой же синтаксис используется для протоколов. Это означает, что в вашем случае «@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 
    } 
} 
Смежные вопросы