4

たとえば、次のコード:

while let data = Provider.getData() {
    ...
}

Swift 2 では、次の 2 つのエラーが発生します。
条件付きバインディングのイニシャライザーには、'String'
呼び出しではなく Optional 型が必要ですが、'try' でマークされておらず、エラーは処理されません。

ここでエラー処理を行うための最善の解決策は何ですか...<br> ...このメソッドでエラーを処理したい場合。
…エラーをスローしたい場合。

4

3 に答える 3

6

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ブロック内で処理する必要があります。

于 2015-06-10T15:31:12.567 に答える
0

while let data = ... は、データが nil の可能性があることを意味します。しかし、あなたのコードでは

Provider.getData()

nil 以外の値を返す必要があります。その構文「while let data = ...」は、nil になるかどうかわからない場合にのみ使用します。

于 2015-07-29T23:15:58.033 に答える