2015-10-18 60 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,即採取NSError **他們最後一個參數Objective-C的方法2.2和Objective-C互操作被轉換爲夫特throws方法當量。

您可以在this page上找到關於此主題的更多信息,使用第3和第4節,摘錄如下。

錯誤處理(excerpt

在可可,產生錯誤的方法採取NSError指針參數作爲它們的最後一個參數,如果發生錯誤,其中填充其參數與NSError對象。 Swift自動將產生錯誤的Objective-C方法轉換爲根據Swift原生錯誤處理功能引發錯誤的方法。

例如,考慮從NSFileManager以下Objective-C的方法:

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

在夫特,它的進口這樣的:

func removeItemAtURL(URL: NSURL) throws 

捕捉和處理錯誤(excerpt

在Objective-C中,錯誤處理是opt-in,這意味着除非提供了錯誤指針,否則通過調用方法產生的錯誤將被忽略。在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); 
} 

下面是在斯威夫特的等效代碼:

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://')") 
} 

問題特定代碼

在此代碼示例中,這意味着,在夫特2.2,GCDAsyncUdpSocketenableBroadcast(error:)方法將是enableBroadcast() throws,將需要使用顯式do-catch

類似地,GCDAsyncUdpSocketbeginReceiving()方法將變成beginReceiving() throws並且還將需要使用do-catch

相關問題