あなたは私が非常に関連性があると思ういくつかの良いプラクティス/ヒントを見つけることができます。それは私にとって良いことでした:彼らは私が一緒に働いた人々、私が従ったコース/チュートリアルから、そして他のガイドラインや良い実践著者からも来ることができます。
最初は、特定のボタンがヒット可能かどうかを確認するときに問題に遭遇しました。単に(アニメーション)、ビューに直接存在しないという理由だけで。私が見つけた興味深い解決策の1つは、これです。
let enableButton = app . buttons [ NSLocalizedString ( " Enable " , comment : " foo " ) ]
expectationForPredicate ( NSPredicate ( format : " hittable == true " ) , evaluatedWithObject : enableButton , handler : nil )
waitForExpectationsWithTimeout ( 3 , handler : nil )述語が真になるまで3秒待ちます(この場合、ボタンが登場するので、ボタンが表示されるまで)。経過時間の後、それは真実ではない、それはxctassert hittable == trueを実行します。

テキストボタンをクリックすると、別のビューをリダイレクトし、正方形をクリックします。
私がやりたかったのは、ボタンをチェックするだけだったので、左側の小さな正方形をタップするだけです。私はそれをしました:
let checkButtonCoordinate = app . buttons [ " CGUButton " ] . coordinateWithNormalizedOffset ( CGVector ( dx : 0 , dy : 0 ) )
checkButtonCoordinate . tap ( ) グローバルおよびローカルでさえ、あらゆるタイプの変数に変数オブザーバーを追加できます。
例を見てみましょう:
var numberOfPerson = 0 {
didSet {
// Do something
}
}
class Person {
var name = " Anonyme " {
didSet {
// Do something else
}
}
func showResume ( ) {
var resume : String ? {
didSet {
// Do what you need to do
}
}
// ...
}
}ストーリーボードを使用して、オブジェクトをプログラム的に行う代わりに、オブジェクトのプロパティを開始できます。
したがって、たとえば、次のことを交換できます。
self . debtView . layer . maskToBounds = true
self . debtView . layer . cornerRadius = 5.0による

cggeometry関数を使用するのではなく、ネイティブSwift struct Initializersを使用します。
したがって、交換:
let myButton = UIButton ( frame : CGRectMake ( 0.0 , 0.0 , self . bounds . width / 2 , self . bounds . height ) )による
let myButton = UIButton ( frame : CGRect ( x : 0.0 , y : 0.0 , width : self . bounds . width / 2 , height : self . bounds . height ) )Objective-Cでは、Cgrectmakeを使用してCgrect structを取得していたため、ストラットを初期化するためには(私のメモリが良い場合のように)最初に構造を作成し、次に変数に値を割り当てる必要があるためです。 Swiftを使用すると、Structにはパラメーターを備えたコンストラクターがあるため、外部関数を使用する必要はありません。
iOS> 9.0がもうdeinit機能でオブザーバーを削除する必要はありません
Appleドキュメントから
OS X 10.11およびiOS 9.0では、NSNotificationCenterおよびNSDistributedNotificationCenterは、契約される可能性のある登録済みのオブザーバーに通知を送信しなくなります[...]これは、オブザーバーがディールロケーション方法で登録を解除する必要はないことを意味します。
数字が範囲の間にあるかどうかを確認するには、しないでください
if number >= 0 && number <= 100代わりに範囲とニュースオペレーターを使用します。
if 0 ... 100 ~= number一部のプロトコル(uitableview、printable、..)に準拠するときは拡張機能を使用して、それがその役割でない限り、よく整理されたコードを維持します。
// MARK: - TableView Delegate -
extension HomeViewController : UITableViewDataSource {
func tableView ( tableView : UITableView , numberOfRowsInSection section : Int ) -> Int {
return 5
}
func numberOfSectionsInTableView ( tableView : UITableView ) -> Int {
return 1
}
// etc.
} Xcodeが叫ぶまでletを使用して、それをvarに置き換えることができます
閉鎖が複数の場所で参照されている場合は、Typealiasを使用します
typealias CoolClosure = ( foo : Int ) -> Bool CGRECTのx、y、幅、または高さにアクセスする場合、rect.width、rect.minyなどを使用することを好みます。これは、迅速な拡張であり、デフォルトでは直接構造メンバーアクセスの代わりに値を標準化します。 Appleのcggeometryリファレンスから:
このリファレンスで説明されているすべての関数は、結果を計算する前に、入力として入力を暗黙的にそれらの長方形を標準化するものとして取得します。このため、アプリケーションは、CGRECTデータ構造に保存されているデータの直接読み取りと書き込みを避ける必要があります。代わりに、ここで説明する関数を使用して、長方形を操作し、その特性を取得します。
例えば :
let rect = CGRect ( origin : CGPoint ( x : 0.0 , y : 0.0 ) , size : CGSize ( width : - 40.0 , height : - 40.0 ) )
rect . size . width // return -40, Not good, negative value
rect . width // return 40, OK
rect . origin . y // return 0.0, Not OK
rect . minY // return -40.0, OKスタンフォードのヒント:実際、一般的に、コードの読者が理解するのが難しい(そして、「最適ではない」アーキテクチャのアプローチを裏切る可能性がある)コードを12回以上持つ方法はおそらく困難になるでしょう。したがって、可能な解決策は、メイン関数内にサブ機能を追加することです。コードに5行がある場合、それを乱用しないでください..:]
プラグママークを使用してコードを整理します
//マーク:-uaitterviewdatasourceデリゲート -
- You can consider making **TODO/FIXME as warning**, sometimes that helps !
- Having a clear application architecuture is good, having a clear/reusable code is awesome. So you better be documented about **design patterns** :
- http://www.raywenderlich.com/46988/ios-design-patterns
- http://www.raywenderlich.com/86053/intermediate-design-patterns-in-swift
- https://github.com/ochococo/Design-Patterns-In-Swift