2017-10-14 8 views
2

私のプロジェクトはCircleCIを使用してユニットテスト用にビルドされており、XCode 8を使用しています。 iOS 11を確認した後でも、がUIViewiOS 10 SDKに存在しないため、次のコードがクラッシュします。UIViewにプロパティがあるかどうかチェック

if #available(iOS 11, *) { 
     make.top.equalTo(testView.safeAreaLayoutGuide.snp.top) 
    } 

testViewUIViewです。ここではナビゲーションバーに制約を追加しています。 UIViewにこの特定のプロパティがあるかどうかを確認する良い方法はありますか? safeAreaLayoutGuideOptionalではありません。

エラーメッセージ:タイプの値が 'のUIView' はメンバー を持っていない 'safeAreaLayoutGuide'

+0

エラーメッセージは何ですか? – aaron

+0

可用性を使用することは、Swiftの異なるプラットフォームを確認するための推奨方法です。 Objective Cにいた場合、セレクタへの応答の確認やSDk内の特定のクラスの存在など、他のものがあります。しかし、SWiftの場合、あなたはそれを完全に正しい方法でやっています。使用可能な –

+0

@aaronを使って、エラーメッセージ – DesperateLearner

答えて

0

CircleCIはif #available(iOS 11, *)でビルドを失敗していました。私はあなたのcircle.ymlファイルでXCode 9にアップグレードすると言うでしょう。それまでは、ビューのView Controllerのtoplayoutguideを使用してください。

2

あなたはUIViewのようrespondsToSelectorを使用することができるはず、まだNSObjectProtocolに準拠しています。

if testView.responds(to: #selector(safeAreaLayoutGuide)) { 
    make.top.equalTo(testView.safeAreaLayoutGuide.snp.top) 
} 
0

の場合safeAreaLayoutGuideを使用している場合は、Xcode 9+のみを使用してください。 safeAreaLayoutGuideはですので、ios11 SDK以降に追加されています。

if #available(iOS 11, *) { 
    print("for iOS 11 User") 
} else { 
    print("for iOS < 11 user") 
} 

if状態における上記チェックは、主コードがiOS10ように下位バージョンで実行されるこれらのユーザのためであろうelse部分にiOS11 &上にあるこれらのユーザーのために使用されます。

Apple Doc

関連する問題