NSLayoutConstraint(item:, attribute:, relatedBy:, toItem:, attribute:, multiplier:, constant:)
でコンパイルされませんAny
として入力item
パラメータがあります。
public convenience init(item view1: Any, attribute attr1: NSLayoutAttribute, relatedBy relation: NSLayoutRelation, toItem view2: Any?, attribute attr2: NSLayoutAttribute, multiplier: CGFloat, constant c: CGFloat)
をしかし、クラッシュから、あなたはそれを収集することができますパラメータは実際にはUIView
またはUILayoutGuide
を受け入れることができます:
キャッチされていない例外 'NSInvalidArgumentException'のためアプリを終了します。理由: 'NSLayoutConstraint for Optional(UIView:0x7fa0fbd06650;フレーム=(0 0; 0 0);レイヤー= CALayer:0x60800003bb60):制約はそれぞれUIView、UILayoutGuideのインスタンスでなければなりません。
コンパイラは、コンパイル時にitem
の型をチェックできません。何かを受け入れるように定義されています。しかし、私たちがアクセスできない実装の詳細では、このメソッドは、オプションのUIView
またはUILayoutGuide
だけを受け入れます。
だからguard
ステートメントを追加します。それはクラッシュなぜ
let view: UIView? = UIView()
guard let view = view else { // Proceed only if unwrapped
fatalError()
}
let _ = NSLayoutConstraint(item: view, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 0.0, constant: 44.0)
このコードはクラッシュしません。それはコンパイルされません。 – Rob
Swift 3でこれをやっているのが分かります。最初のパラメータは 'AnyObject'です(' AnyObject'は 'item2'と同じです)。オプションを渡した場合、正しく警告されます。これは 'Any'(' item2'のような 'Any''ではなく)です。コンパイラは、最初のパラメータがオプションであってはならないという事実について、私たちにはっきりと警告していません。しかし、それはオプションではありません、そして、あなたがオプションのものを渡そうとすると、それは明らかに好きではありません。 – Rob
はい、私はSwift 3(Xcode 8)を意味しました。 –