web-dev-qa-db-ja.com

「as?」、「as!」、「as」の違いは何ですか?

Swift 1.2にアップグレードする前に、次の行を書くことができました。

if let width = imageDetails["width"] as Int?

今、私はこの行を書くことを強制します:

if let width = imageDetails["width"] as! Int?

私の質問は、上記のように書くことを余儀なくされた場合、以下のコードを書くだけで同じことはできませんか? imageDetailsのすべての値で同じ結果が得られますか?

if let width = imageDetails["width"] as Int
52
Alex

アップキャストとダウンキャストの両方を行うために使用されるasキーワード:

// Before Swift 1.2
var aView: UIView = someView()

var object = aView as NSObject // upcast 

var specificView = aView as UITableView // downcast

派生クラスから基本クラスへのアップキャストは、コンパイル時にチェックでき、失敗することはありません。

ただし、特定のクラスについて常に確認できるとは限らないため、ダウンキャストは失敗する可能性があります。 UIViewがある場合は、UITableViewまたはUIButtonの可能性があります。あなたのダウンキャストが正しいタイプに行く場合-素晴らしい!ただし、間違ったタイプを指定すると、ランタイムエラーが発生し、アプリがクラッシュします。

Swift 1.2では、ダウンキャストはas?を使用するオプションか、as!を使用する「強制フェイル可能」である必要があります。タイプに確信がある場合は、as!を使用してキャストを強制できます。暗黙的にアンラップされたオプションの使用方法:

// After Swift 1.2
var aView: UIView = someView()

var tableView = aView as! UITableView

感嘆符は、あなたが何をしているのかを知っていること、そして誤ってタイプを間違えた場合に物事がひどく間違って行く可能性があることを絶対に明確にします!

いつものように?オプションのバインディングを使用するのが最も安全な方法です。

// This isn't new to Swift 1.2, but is still the safest way
var aView: UIView = someView()

if let tableView = aView as? UITableView {
  // do something with tableView
}

これをサイトから入手しました: [〜#〜] source [〜#〜]

66
Eendje

as

Swift 1.2以降では、asupcasting(または曖昧さ回避)およびパターンマッチング

// 'as' for disambiguation
let width = 42 as CGFloat
let block = { x in x+1 } as Double -> Double
let something = 3 as Any?  // optional wrapper can also be added with 'as'


// 'as' for pattern matching
switch item {
case let obj as MyObject:
    // this code will be executed if item is of type MyObject
case let other as SomethingElse:
    // this code will be executed if item is of type SomethingElse
...
}

as?

conditionalキャスト演算子as?は変換を実行しようとしますが、変換できない場合はnilを返します。したがって、その結果はオプションです。

let button = someView as? UIButton  // button's type is 'UIButton?'

if let label = (superview as? MyView)?.titleLabel {
    // ...
}

as!

as!演算子は、forced型変換用です。

型キャスト演算子の強制形式(as!)ダウンキャストが常に成功するsureの場合のみ。この形式の演算子は、誤ったクラスタイプにダウンキャストしようとすると実行時エラーをトリガーします。

// 'as!' for forced conversion.
// NOT RECOMMENDED.
let buttons = subviews as! [UIButton]  // will crash if not all subviews are UIButton
let label = subviews.first as! UILabel
40
jtbandes

(Swift少なくとも1.2まで)のすべてのバージョンで)必要なことを正確に行う必要がある正しいイディオムは、as?オプションのキャスト。

if let width = imageDetails["width"] as? Int

オプションのキャストはオプション(この場合はInt?)を返し、実行時にテストされます。元のコードは、おそらくオプションの型へのキャストを強制しました。

0
Joseph Lord