2014-12-18 109 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行之後)作爲讀者的練習。

相關問題