คุณจะพบว่ามีวิธีปฏิบัติที่ดี/คำแนะนำที่ฉันคิดว่ามีความเกี่ยวข้องมากและนั่นเป็นสิ่งที่ดีสำหรับฉัน: พวกเขาสามารถมาจากคนที่ฉันทำงานด้วยจากหลักสูตร/บทเรียนที่ฉันปฏิบัติตามและจากแนวทางอื่น ๆ และแนวทางปฏิบัติที่ดี
ในตอนแรกฉันพบปัญหาเมื่อตรวจสอบว่าปุ่มใดปุ่มหนึ่งที่น่าประทับใจหรือไม่เพียงเพราะมันจางหายไปใน (ภาพเคลื่อนไหว) และไม่ปรากฏโดยตรงในมุมมอง ทางออกที่น่าสนใจอย่างหนึ่งที่ฉันพบคือสิ่งนี้:
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โดย

ใช้ struct swift native struct initializers แทนที่จะใช้ฟังก์ชั่น cggeometry
ดังนั้นแทนที่:
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 เพราะสำหรับการเริ่มต้น strut จึงจำเป็น (เช่นใน C หากหน่วยความจำของฉันดี) เพื่อสร้างโครงสร้างก่อนแล้วจึงกำหนดค่าให้กับตัวแปร ด้วย Swift struct มีตัวสร้างที่มีพารามิเตอร์ดังนั้นไม่จำเป็นต้องใช้ฟังก์ชั่นภายนอก
คุณไม่จำเป็นต้องลบผู้สังเกตการณ์ในฟังก์ชั่น deinit เมื่อ iOS> 9.0 อีกต่อไป
จากเอกสารของ Apple
ใน OS X 10.11 และ iOS 9.0 NSNotificationCenter และ NSDributedNotificationCenter จะไม่ส่งการแจ้งเตือนไปยังผู้สังเกตการณ์ที่ลงทะเบียนอีกต่อไปซึ่งอาจมีการจัดการ [... ] ซึ่งหมายความว่าผู้สังเกตการณ์ไม่จำเป็นต้องไม่ลงทะเบียนในวิธีการจัดการ
เพื่อตรวจสอบว่าตัวเลขอยู่ระหว่างช่วง อย่าทำ
if number >= 0 && number <= 100ใช้ผู้ให้บริการช่วงและข่าว แทน :
if 0 ... 100 ~= numberใช้ ส่วนขยาย เมื่อสอดคล้องกับโปรโตคอลบางอย่าง (uitableView พิมพ์ได้ .. ) เพื่อเก็บรหัสที่จัดระเบียบไว้อย่างดีเว้นแต่ว่าเป็นบทบาทของมัน
// 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 yell เพื่อให้คุณสามารถแทนที่ด้วย var
ใช้ typealias เมื่อมีการอ้างอิงปิดในหลาย ๆ สถานที่
typealias CoolClosure = ( foo : Int ) -> Bool เมื่อเข้าถึง x, y, ความกว้างหรือความสูงของ cgrect ชอบใช้ rect.width, rect.miny ฯลฯ ซึ่งเป็นส่วนขยายที่รวดเร็วและโดยค่าเริ่มต้นค่ามาตรฐานแทนการเข้าถึงสมาชิกโครงสร้างโดยตรง จากการอ้างอิง cggeometry ของ Apple:
ฟังก์ชั่นทั้งหมดที่อธิบายไว้ในการอ้างอิงนี้ที่ใช้โครงสร้างข้อมูล CGRECT เป็นอินพุตโดยปริยายที่เป็นมาตรฐานสี่เหลี่ยมเหล่านั้นก่อนคำนวณผลลัพธ์ ด้วยเหตุผลนี้แอปพลิเคชันของคุณควรหลีกเลี่ยงการอ่านและการเขียนข้อมูลที่เก็บไว้ในโครงสร้างข้อมูล 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, OKStanford Hint: ในความเป็นจริงโดยทั่วไปวิธีใด ๆ ที่มีรหัสมากกว่าหนึ่งโหลอาจเป็นเรื่องยากสำหรับผู้อ่านรหัสของคุณที่จะเข้าใจ (และอาจหักหลังวิธีการทางสถาปัตยกรรมที่“ น้อยกว่าที่เหมาะสมที่สุด”) ดังนั้นวิธีแก้ปัญหาที่เป็นไปได้คือการเพิ่มฟังก์ชั่นย่อยภายในฟังก์ชั่นหลัก อย่าใช้ในทางที่ผิดถ้าคุณมี 5 บรรทัดในรหัสของคุณ .. :]
ใช้ เครื่องหมาย Pragma เพื่อจัดระเบียบรหัสของคุณ
// Mark: - UitableViewDataSource Delegate -
- 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