条件绑定中的绑定值必须是Swift中的Optional类型

use*_*761 2 macos xcode input swift

我正在尝试获取下面的代码,以允许我在控制台中输入Accept或Reject; 但是在线"if var userData = 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()
Run Code Online (Sandbox Code Playgroud)

小智 7

错误告诉您userData必须是可选类型.但是fileHandle.availableData返回NSData不属于可选类型的东西.所以你必须让它成为可选的.

(此外,你的函数声明它返回一个String,但你没有从它返回任何东西.你可以使用let而不是var.并且userString将是一个可选的.)所以:

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()
Run Code Online (Sandbox Code Playgroud)

但是,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()
Run Code Online (Sandbox Code Playgroud)

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