条件绑定中的绑定值必须是Swift中的可选类型
问题描述:
我试图让下面的代码允许我将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()
答
错误是告诉你,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()
但是,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
行之后)作为读者的练习。
该线程的答案太模糊,无法帮助解决此问题。 – user3708761 2014-12-18 22:48:06
另一个更多的是关于可选项与有条件铸造有关;这个问题可以独立存在。 (除非有另一个关于返回非可选值和像@ i40west这样的答案的API的问题。) – rickster 2014-12-19 06:22:14