Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 无法转换类型为';inout n错误?';_Swift - Fatal编程技术网

Swift 无法转换类型为';inout n错误?';

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())

我得到的错误是:

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

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.2和Objective-C互操作性

之所以出现这种情况,是因为在Swift 2.2中,对其最后一个参数采用
NSError**
的Objective-C方法被转换为Swift
throws
方法等价物

您可以使用下面摘录的第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–引入了一种新的错误处理语法。语言指南中有描述