getData( ) 関数は、オプションの値ではなく文字列値を返します。したがって、getData 関数の戻り値の型を、? を使用してオプションの値の型に変更する必要があります。オペレーター
while let は常にオプションの値を期待します。getData 関数が常に文字列値を返す場合、while let を使用しても意味がありません。これは、getData 関数が常に文字列値を返し、それをアンラップしようとすることを意図的にコンパイラに伝えているためです。 t オプションでない値をアンラップします。
エラー処理のコード( Swifterを念頭に置いて書かれています):
private func nextLine() throws -> String?{
var returnData : String? = ""
if arc4random_uniform(7) != 3 {
returnData = "Genreated Random number other than 3"
}else{
throw NSError(domain: "Generated random number 3", code: 111, userInfo: nil)
}
return returnData
}
do {
while let headerLine = try nextLine() {
//do something with the header
print(headerLine)
}
}catch{
//Handle exception
print(error)
}
nextLine 関数は、生成された数値が 3 に等しくない場合、「3 以外の生成された乱数」を示す文字列を返します。そうでない場合は、catch ブロックで処理できる例外をスローします。値。nextLine 関数の戻り値の型から。「条件値の初期化子には文字列ではなくオプションの型が必要です」というエラーが表示されます。これは、コンパイラが意味のない非オプションの値をラップ解除しようとしていることを意味します。
検討 :
var someIntegerValue = 5
if let x = someIntegerValue
{
// it will give an error
}
上記のコードでは、「条件付きバインドの初期化子には、Int ではなく、オプションの型が必要です」というエラーが表示されます。
If you replace var some = 5 with var some : Int? = 5 it will be all right.
エラー/例外処理:
doブロック内に書き込まれるべき値をフェッチする前にtryキーワードを使用できます。値をフェッチするか、例外を発生させます。例外はcatchブロック内で処理する必要があります。