Swift 2:二进制运算符'=='不能应用于'()类型的操作数?'和'布尔'

时间:2015-11-08 08:11:12

标签: ios swift swift2 cocoaasyncsocket

在我更新Xcode 7 beta并将我的swift代码转换为Swift 2之后,我得到了这两个我无法弄清楚的错误..

  

调用可以抛出,但没有标记为'try'并且未处理错误

     

二元运算符'=='不能应用于'()类型的操作数?'和'布尔'

我的代码在这里。

if self.socket?.connectToHost(host, onPort: port, viaInterface: interfaceName, withTimeout: 10) == true {
// connecting
} else {
// error
  let delay = 1 * Double(NSEC_PER_SEC)
  let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
  dispatch_after(time, dispatch_get_main_queue(), {
  self._connect()
  })
}

知道可能出现什么问题?

快照:

enter image description here

1 个答案:

答案 0 :(得分:3)

根据Swift中如何使用CocoaAsyncSocket框架,函数connectToHost:onPort:viaInterface:withTimeout:没有返回值。相反,它只会抛出。因此,错误的含义是Void,无返回值,无法与Bool进行比较。

它在Swift中的声明是:

func connectToHost(host: String!, onPort port: UInt16, viaInterface interface: String!, withTimeout timeout: NSTimeInterval) throws

这与其与Objective-C一起使用时的声明不同,声明为:

- (BOOL)connectToHost:(NSString *)hostname onPort:(UInt16)port withTimeout:(NSTimeInterval)timeout

顺便一下,在Objective-C中,你可以处理一个nil,好像它是一个布尔值,非零值被评估为TRUE,但是这些可能性是从Swift中删除的,因为它们是常见的错误来源。

要处理错误,需要使用以下形式称为do-try-catch。以下是根据您的代码调整的示例:

do {
    try self.socket?.connectToHost(host, onPort: port, viaInterface: interfaceName, withTimeout: 10) 
    // connecting
} catch let error as NSError {
    // Handle the error here.
    let delay = 1 * Double(NSEC_PER_SEC)
    let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
    dispatch_after(time, dispatch_get_main_queue(), {
        self._connect()
    })
}