2014-12-18 101 views
2

我试图让下面的代码允许我将Accept或Reject输入到控制台中;但是上线“如果VAR的userdata = {fileHandle.availableData”我得到的错误条件绑定中的绑定值必须是Swift中的可选类型

绑定的值在条件结合必须是可选类型的

func input() -> String { 
    var fileHandle = NSFileHandle.fileHandleWithStandardInput() 
    println("Accept or Reject") 
    if var userData = fileHandle.availableData{ 
     var userString = NSString(data: userData, encoding: NSUTF8StringEncoding) 
     println("You have been \(userString)") 
    } 
} 

input() 
+1

该线程的答案太模糊,无法帮助解决此问题。 – user3708761 2014-12-18 22:48:06

+0

另一个更多的是关于可选项与有条件铸造有关;这个问题可以独立存在。 (除非有另一个关于返回非可选值和像@ i40west这样的答案的API的问题。) – rickster 2014-12-19 06:22:14

回答

7

错误是告诉你,userData必须的一个可选类型。但是fileHandle.availableData返回不是可选类型的NSData。所以你必须让它成为可选的。

(另外,你的函数声明其返回String,但你不能从它返回任何东西,你可以用let代替varuserString将是可选的。)所以:

func input() { 
    var fileHandle = NSFileHandle.fileHandleWithStandardInput() 
    println("Accept or Reject") 
    if let userData = fileHandle.availableData as NSData? { 
     let userString = NSString(data: userData, encoding: NSUTF8StringEncoding) 
     println("You have been \(userString!)") 
    } 
} 

input() 

但是,fileHandle.availableData实际上不failable,这就是为什么你首先得到错误。 if var(或if let)构造想要一个可选项,并且函数不返回一个。因此,整个if测试是多余的,因为它不会失败。因此:

func input() { 
    var fileHandle = NSFileHandle.fileHandleWithStandardInput() 
    println("Accept or Reject") 
    let userData = fileHandle.availableData 
    let userString = NSString(data: userData, encoding: NSUTF8StringEncoding) 
    println("You have been \(userString!)") 
} 

input() 

这将当然,接受任何输入,包括一个空字符串。验证用户数据(在let userString行之后)作为读者的练习。

相关问题