2016-05-20 7 views
0

私はこのコードでif letラインで悪名高いfatal error: unexpectedly found nil while unwrapping an Optional valueエラーを得た:Swiftの暗黙のうちにアンラップされたオプションを安全に処理するための簡潔な方法は何ですか?

var displayShelves: [Shelf] { 
    get { 
     if let shelves = rootShelf.childShelves as NSArray as? [Shelf] { 
      return shelves 
     } 
     return [] 
} 

この理由はrootShelf.childShelvesvar childShelves: NSMutableArray! { get set }としてスウィフトにインポートされている客観Cクラスですので、私はしようとするということです[Shelf]にキャストすると、nilに等しくなります。余分なifまたはguardを使わずに、これを簡潔にどのようにアンラップするのですか?私は次のことを行うことができます:

var displayShelves: [Shelf] { 
    get { 
     if rootShelf.childShelves != nil { 
      if let shelves = rootShelf.childShelves as NSArray as? [Shelf] { 
       return shelves 
      } 
     } 
     return [] 
    } 
} 

しかし、これは、オプションのチェーンが防止する必要がある種類のコードです!だから、これを行うための迅速な方法がありますか? rootShelf.childShelvesnilとき

答えて

0

のタイプがT!の場合、x as Tは強制解除のように動作します。 x as T?を使用して、オプションとして扱い続けることができます。

あなたの場合は、return rootShelf.childShelves as NSArray? as? [Shelf] ?? []とすることができます。

0

次はクラッシュしない:

var displayShelves: [Shelf] { 
    get { 
     if rootShelf.childShelves != nil, let shelves = rootShelf.childShelves as NSArray as? [Shelf] { 
      return shelves 
     } 
     return [] 
    } 
} 

私は,オペレータは、このような短絡に保証されていることを100%わかりません。

+0

これはあなた自身の質問に対する実際の回答であるか、これはあなたの質問の詳細な情報を意味していますか?後者の場合は、この回答を削除し、質問に情報を入れてください。 – rmaddy

+1

私には妥当な自己回答のようです。 – jtbandes

+0

@jtbandes最後の文章のために私は尋ねます。 – rmaddy

関連する問題