我得到的错误:
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之前我没有任何错误。
答案 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
。