2015-10-18 2 views
2

Ошибки я получаю:Невозможно преобразовать значение типа 'inout NSError?'

1) Дополнительный аргумент 'ошибка' в вызове

2) Невозможно преобразовать значение типа 'INOUT NSError? (Так называемый "INOUT ТИнструкциям) ожидаемого типа аргумента '()'

Мой код:

func initUdpSocket(){ 
     var error : NSError? 
     mUdpSocket = GCDAsyncUdpSocket(delegate: self, delegateQueue: dispatch_get_main_queue()) 
     mUdpSocket.enableBroadcast(true,error: &error) 
     mUdpSocket.beginReceiving(&error) 

    } 

    func udpSocket(sock: GCDAsyncUdpSocket!, didReceiveData data: NSData!, fromAddress address: NSData!, withFilterContext filterContext: AnyObject!) { 
     print("\(__FUNCTION__),\(__LINE__),\(data)"); 
    } 

    func udpSocket(sock: GCDAsyncUdpSocket!, didSendDataWithTag tag: Int) { 
     print("\(__FUNCTION__),\(__LINE__),\(tag)"); 
    } 

    func udpSocket(sock: GCDAsyncUdpSocket!, didConnectToAddress address: NSData!) { 
     print("\(__FUNCTION__),\(__LINE__),\(address)"); 
    } 
    func udpSocket(sock: GCDAsyncUdpSocket!, didNotConnect error: NSError!) { 
     print("\(__FUNCTION__),\(__LINE__),\(error)"); 
    } 

} 

Могу ли я знать, что случилось с моими кодами ?? Перед обновлением xcode у меня были какие-то ошибки.

+1

Swift 2 - Думаю, вы говорите о Swift 2 - вводит новый синтаксис обработки ошибок. Это описано в руководстве по языку – vadian

ответ

0

Swift 2,2 и Objective-C Interoperability в Обработка ошибок

Это, кажется, происходит потому, что в Swift 2.2, методы Objective-C, которые берут NSError ** для последнего параметра преобразуются в методе Swift throws эквивалент.

Дополнительную информацию по этой теме можно получить по адресу this page, используя 3-й и 4-й разделы, приведенные ниже.

Обработка ошибок (excerpt)

В какао, методы, которые производят ошибки принимают параметр NSError указателя в качестве последнего параметра, который заполняет свой аргумент с NSError объекта в случае возникновения ошибки. Swift автоматически переводит методы Objective-C, которые приводят к ошибкам в методах, которые вызывают ошибку в соответствии с встроенной функцией обработки ошибок Swift.

Для примера рассмотрим следующий метод Objective-C из NSFileManager:

- (BOOL)removeItemAtURL:(NSURL *)URL 
        error:(NSError **)error; 

В Swift, это импортное, как это:

func removeItemAtURL(URL: NSURL) throws 

Ловля и обработка ошибки (excerpt)

В Objective-C обработка ошибок включена, что означает, что ошибки, вызванные вызовом метода, игнорируются, если не указан указатель ошибок. В Swift вызов метода, который выбрасывает, требует явной обработки ошибок.

Вот пример того, как обрабатывать ошибки при вызове метода в Objective-C:

NSFileManager *fileManager = [NSFileManager defaultManager]; 
NSURL *fromURL = [NSURL fileURLWithPath:@"/path/to/old"]; 
NSURL *toURL = [NSURL fileURLWithPath:@"/path/to/new"]; 
NSError *error = nil; 
BOOL success = [fileManager moveItemAtURL:URL toURL:toURL error:&error]; 
if (!success) { 
    NSLog(@"Error: %@", error.domain); 
} 

А вот эквивалентный код в Swift:

let fileManager = NSFileManager.defaultManager() 
let fromURL = NSURL(fileURLWithPath: "/path/to/old") 
let toURL = NSURL(fileURLWithPath: "/path/to/new") 
do { 
    try fileManager.moveItemAtURL(fromURL, toURL: toURL) 
} catch let error as NSError { 
    print("Error: \(error.domain)") 
} 

Кроме того, вы можете использовать комбинации catch для соответствия конкретным кодам ошибок в качестве удобного способа дифференцирования возможных условий отказа:

do { 
    try fileManager.moveItemAtURL(fromURL, toURL: toURL) 
} catch NSCocoaError.FileNoSuchFileError { 
    print("Error: no such file exists") 
} catch NSCocoaError.FileReadUnsupportedSchemeError { 
    print("Error: unsupported scheme (should be 'file://')") 
} 

Вопрос-специфический код

В этом примере кода, это означает, что в Swift 2.2, enableBroadcast(error:) метод GCDAsyncUdpSocket будет enableBroadcast() throws и нужно будет использовать явное do-catch.

Аналогично, beginReceiving() метод GCDAsyncUdpSocket превратится в beginReceiving() throws и также потребует использование do-catch.

Смежные вопросы