【问题标题】:Cannot convert value of type 'inout NSError?'无法转换“inout NSError”类型的值?
【发布时间】:2015-10-18 11:34:11
【问题描述】:

我遇到的错误:

1) 调用中的额外参数“错误”

2) 无法转换“inout 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 之前,我没有任何错误。

【问题讨论】:

  • Swift 2——我猜你说的是 Swift 2——引入了一种新的错误处理语法。语言指南中对此进行了描述

标签: swift


【解决方案1】:

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

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

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

错误处理 (excerpt)

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

例如,考虑以下来自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 中,GCDAsyncUdpSocketenableBroadcast(error:) 方法将是 enableBroadcast() throws,并且需要使用显式的 do-catch

同样,GCDAsyncUdpSocketbeginReceiving() 方法会变成 beginReceiving() throws,并且还需要使用 do-catch

【讨论】:

    猜你喜欢
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多