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

问题描述:

我Xcode更新7测试版,我的SWIFT代码转换为斯威夫特2后,我得到了我想不通这两个错误..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

+0

布尔是/否...'如果{...}'或'如果(myBool){...}' –

+2

对于记录,你应该避免'== true'。这是多余的。只要使用'if condition'。 – Arc676

基础上CocoaAsyncSocket框架是如何在斯威夫特使用,功能connectToHost:onPort:viaInterface:withTimeout:没有返回值。相反,它只会抛出。因此,错误的含义是Void(无返回值)无法与Bool进行比较。

及其在夫特声明为:

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

与目的-C中使用时,其中的声明这不同于它的声明:

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

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

要处理该错误,需要以下形式称为do-try-catch。这是调整你的代码示例:(!myBool)

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() 
    }) 
} 
+2

无效无法用作任何语言的布尔 – Sulthan

+0

@Sulthan这是正确的。我在考虑Objective-C中BOOL类型的不精确性,但是我错误地将它应用于Void类型。 – Daniel

+0

@DanielZhang谢谢。它解决了。如你所说,我需要改变错误处理方法。 –