Swift 无法转换类型为';inout n错误?';
我得到的错误是: 1) 调用中的额外参数“error” 2) 无法将类型为“inout NSError”(也称为“inout Optional”)的值转换为预期的参数类型“()” 我的代码:Swift 无法转换类型为';inout n错误?';,swift,Swift,我得到的错误是: 1) 调用中的额外参数“error” 2) 无法将类型为“inout NSError”(也称为“inout Optional”)的值转换为预期的参数类型“()” 我的代码: func initUdpSocket(){ var error : NSError? mUdpSocket = GCDAsyncUdpSocket(delegate: self, delegateQueue: dispatch_get_main_queue())
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之前,我没有遇到任何错误 错误处理中的Swift 2.2和Objective-C互操作性 之所以出现这种情况,是因为在Swift 2.2中,对其最后一个参数采用
NSError**
的Objective-C方法被转换为Swiftthrows
方法等价物
您可以使用下面摘录的第3节和第4节在上找到有关此主题的更多信息
错误处理()
在Cocoa中,产生错误的方法将NSError
指针参数作为其最后一个参数,如果发生错误,该参数将使用NSError
对象填充其参数。Swift自动将产生错误的Objective-C方法转换为根据Swift本机错误处理功能抛出错误的方法
例如,考虑下面的Objto-C方法从<代码> NSF文件> <代码>:
- (BOOL)removeItemAtURL:(NSURL *)URL
error:(NSError **)error;
在Swift中,它是这样导入的:
func removeItemAtURL(URL: NSURL) throws
捕获和处理错误()
在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);
}
以下是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中,GCDAsyncUdpSocket
的enableBroadcast(error:)
方法将是enableBroadcast()抛出
,并且需要使用显式的do catch
类似地,
GCDAsyncUdpSocket
的beginReceiving()
方法将变成beginReceiving()throws
,并且还需要使用do catch
Swift 2–我猜您在谈论Swift 2–引入了一种新的错误处理语法。语言指南中有描述