Anda akan menemukan di sana beberapa praktik/petunjuk yang baik yang menurut saya sangat relevan dan itu baik bagi saya: mereka dapat datang dari orang yang bekerja dengan saya, dari kursus/tutorial yang saya ikuti, dan juga dari pedoman lain dan penulis praktik yang baik.
Pada awalnya, saya mengalami masalah ketika memeriksa apakah tombol tertentu dapat dipukul atau tidak, hanya karena itu memudar (animasi) dan karenanya tidak langsung hadir dalam tampilan. Salah satu solusi menarik yang saya temukan adalah yang satu ini:
let enableButton = app . buttons [ NSLocalizedString ( " Enable " , comment : " foo " ) ]
expectationForPredicate ( NSPredicate ( format : " hittable == true " ) , evaluatedWithObject : enableButton , handler : nil )
waitForExpectationsWithTimeout ( 3 , handler : nil ) Ini akan menunggu selama 3 detik sampai predikatnya benar (dalam kasus kami, tombolnya dapat dipukul, jadi sampai tombol muncul). Setelah waktu yang berlalu, itu tidak benar, itu akan mengeksekusi xctassert hittable == true .

Mengklik tombol teks mengalihkan saya tampilan lain, dan mengklik Square, periksa.
Apa yang ingin saya lakukan hanyalah memeriksa tombol, jadi hanya mengetuk kotak kecil di sebelah kiri. Saya melakukannya dengan:
let checkButtonCoordinate = app . buttons [ " CGUButton " ] . coordinateWithNormalizedOffset ( CGVector ( dx : 0 , dy : 0 ) )
checkButtonCoordinate . tap ( ) Anda dapat menambahkan pengamat variabel dalam segala jenis variabel, bahkan global dan lokal .
Mari kita lihat contoh:
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
}
}
// ...
}
}Anda dapat menggunakan dari storyboard Anda untuk memasukkan beberapa properti objek Anda alih -alih melakukannya secara terprogram.
Jadi, Anda bisa misalnya, ganti:
self . debtView . layer . maskToBounds = true
self . debtView . layer . cornerRadius = 5.0oleh

Gunakan inisialisasi SWIFT Struct asli daripada menggunakan fungsi cGgeometry.
Jadi ganti:
let myButton = UIButton ( frame : CGRectMake ( 0.0 , 0.0 , self . bounds . width / 2 , self . bounds . height ) )oleh
let myButton = UIButton ( frame : CGRect ( x : 0.0 , y : 0.0 , width : self . bounds . width / 2 , height : self . bounds . height ) )Karena di Objective-C, kami biasa menggunakan CGRectMake untuk mendapatkan struct cgrect karena untuk menginisialisasi penyangga, itu perlu (seperti pada C jika ingatan saya baik) untuk membuat struktur terlebih dahulu, dan kemudian menetapkan nilai ke variabel. Dengan Swift, struct memiliki konstruktor dengan parameter, jadi tidak perlu menggunakan fungsi eksternal.
Anda tidak perlu menghapus pengamat dalam fungsi deinit saat iOS> 9.0 lagi
Dari dokumentasi Apple
Dalam OS X 10.11 dan iOS 9.0 NSNotificationCenter dan NSDistributedNotificationCenter tidak akan lagi mengirim pemberitahuan kepada pengamat terdaftar yang mungkin ditangani [...] ini berarti bahwa pengamat tidak diharuskan untuk tidak mendaftar dalam metode deallokasi mereka.
Untuk memeriksa apakah angka antara rentang, jangan lakukan
if number >= 0 && number <= 100Gunakan rentang dan operator berita sebagai gantinya :
if 0 ... 100 ~= numberGunakan ekstensi saat menyesuaikan diri dengan beberapa protokol (UITableView, dicetak, ..) untuk menyimpan kode yang terorganisir dengan baik kecuali jika itu perannya.
// MARK: - TableView Delegate -
extension HomeViewController : UITableViewDataSource {
func tableView ( tableView : UITableView , numberOfRowsInSection section : Int ) -> Int {
return 5
}
func numberOfSectionsInTableView ( tableView : UITableView ) -> Int {
return 1
}
// etc.
} Gunakan Biarkan sampai Xcode berteriak sehingga Anda dapat menggantinya dengan var
Gunakan Typealias saat penutupan dirujuk di banyak tempat
typealias CoolClosure = ( foo : Int ) -> Bool Saat mengakses x, y, lebar, atau ketinggian cgrect, lebih suka menggunakan rect.width, rect.miny, dll. Itu adalah ekstensi cepat dan bahwa secara default menstandarkan nilai alih -alih akses anggota struct langsung. Dari referensi CGGEOMETRY Apple:
Semua fungsi yang dijelaskan dalam referensi ini yang mengambil struktur data CGRECT sebagai input secara implisit membakukan persegi panjang tersebut sebelum menghitung hasilnya. Untuk alasan ini, aplikasi Anda harus menghindari membaca secara langsung dan menulis data yang disimpan dalam struktur data CGRECT. Sebaliknya, gunakan fungsi yang dijelaskan di sini untuk memanipulasi persegi panjang dan untuk mengambil karakteristik mereka.
Misalnya :
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, OKStanford Petunjuk: Sebenarnya, secara umum, metode apa pun yang memiliki lebih dari selusin baris kode mungkin akan sulit bagi pembaca kode Anda untuk memahami (dan mungkin mengkhianati pendekatan arsitektur yang "kurang optimal"). Jadi solusi yang mungkin adalah menambahkan sub-fungsi di dalam fungsi utama. Jangan menyalahgunakan itu jika Anda memiliki 5 baris dalam kode Anda ..:]
Gunakan tanda pragma untuk mengatur kode Anda
// Mark: - Delegasi UITableViewDataSource -
- 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