Xcode 条件绑定中的绑定值必须是Swift中的可选类型

Xcode 条件绑定中的绑定值必须是Swift中的可选类型,xcode,macos,swift,input,Xcode,Macos,Swift,Input,我正在尝试获取下面的代码,以允许我在控制台中输入Accept或Reject;但是在“IfVarUserData=fileHandle.availableData{”行中,我得到了错误 条件绑定中的绑定值必须是可选类型 func input() -> String { var fileHandle = NSFileHandle.fileHandleWithStandardInput() println("Accept or Reject") if var userData

我正在尝试获取下面的代码,以允许我在控制台中输入Accept或Reject;但是在“IfVarUserData=fileHandle.availableData{”行中,我得到了错误

条件绑定中的绑定值必须是可选类型

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

错误告诉您,
userData
必须是可选类型。但是
fileHandle.availableData
返回的
NSData
不是可选类型。因此,您必须将其设置为可选类型

(此外,您的函数声明它返回一个
字符串
,但您没有从中返回任何内容。您可以使用
let
而不是
var
userString
将是可选的。)因此:

但是,
fileHandle.availableData
实际上是不可失败的,这就是为什么首先会出现错误的原因。
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
行之后)作为练习留给读者。

该线程中的答案太模糊,无法帮助我解决这个问题。另一个问题更多地是关于可选的,因为它与条件转换有关;这个问题可以独立解决。(除非有关于返回非可选值的API的另一个问题,以及类似@i40west的答案。)
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()