无法转换类型' in out NSError的值?'

时间:2015-10-18 11:34:12

标签: swift

我得到的错误:

1)额外的争论'错误'在电话中

2)无法转换类型' in out NSError?' (又名' inout Optional')预期参数类型'()'

我的代码:

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 个答案:

答案 0 :(得分:0)

错误处理中的Swift 2.2和Objective-C互操作性

这似乎正在发生,因为在Swift 2.2中,将NSError **用于其最后一个参数的Objective-C方法转换为等效的Swift throws方法。

您可以使用下面摘录的第3和第4部分,在this page上找到有关此主题的更多信息。

错误处理(excerpt

  

在Cocoa中,产生错误的方法会将NSError指针参数作为最后一个参数,如果发生错误,则会使用NSError对象填充其参数。 Swift会自动将产生错误的Objective-C方法转换为根据Swift的本机错误处理功能引发错误的方法。

例如,请考虑NSFileManager中的以下Objective-C方法:

- (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:)的{​​{1}}方法将为GCDAsyncUdpSocket,并且需要使用显式enableBroadcast() throws。< / p>

同样,do-catch的{​​{1}}方法会转变为beginReceiving(),并且还需要使用GCDAsyncUdpSocket