ความเข้าใจของฉันคือชุดและรับนั้นใช้สำหรับคุณสมบัติที่คำนวณได้ (ไม่มีการสำรองจากคุณสมบัติที่เก็บไว้ )
หากคุณมาจาก Objective-C โดยคำนึงว่าการตั้งชื่อนั้นเปลี่ยนไป ใน Swift ตัวแปร iVar หรืออินสแตนซ์ถูกตั้งชื่อคุณสมบัติที่เก็บไว้
ตัวอย่าง 1 (คุณสมบัติอ่านอย่างเดียว) - มีคำเตือน:
var test : Int {
get {
return test
}
}
สิ่งนี้จะส่งผลให้เกิดการเตือนเพราะสิ่งนี้จะส่งผลให้เกิดการเรียกใช้ฟังก์ชันแบบเรียกซ้ำ (ตัวเรียกการเรียกตัวเอง) คำเตือนในกรณีนี้คือ "ความพยายามในการปรับเปลี่ยน
ตัวอย่างที่ 2 การอ่าน / เขียนตามเงื่อนไข - พร้อมคำเตือน
var test : Int {
get {
return test
}
set (aNewValue) {
//I've contrived some condition on which this property can be set
//(prevents same value being set)
if (aNewValue != test) {
test = aNewValue
}
}
}
ปัญหาที่คล้ายกัน - คุณไม่สามารถทำสิ่งนี้ได้เนื่องจากเรียกใช้ตัวตั้งค่าซ้ำ นอกจากนี้โปรดทราบรหัสนี้จะไม่บ่นเกี่ยวกับการไม่มี initialisers เป็นไม่มีคุณสมบัติการเก็บไว้ Initialise
ตัวอย่างที่ 3 คุณสมบัติการอ่าน / เขียนที่มีการสำรองข้อมูล
นี่คือรูปแบบที่อนุญาตการตั้งค่าตามเงื่อนไขของคุณสมบัติที่จัดเก็บจริง
//True model data
var _test : Int = 0
var test : Int {
get {
return _test
}
set (aNewValue) {
//I've contrived some condition on which this property can be set
if (aNewValue != test) {
_test = aNewValue
}
}
}
หมายเหตุข้อมูลจริงเรียกว่า _test (แม้ว่าจะเป็นข้อมูลหรือชุดข้อมูล) หมายเหตุก็จำเป็นที่จะต้องให้ค่าเริ่มต้น (หรือคุณจำเป็นต้องใช้วิธีการเริ่มต้น) เพราะ _test เป็นตัวแปรอินสแตนซ์จริง ๆ
ตัวอย่างที่ 4 การใช้ความตั้งใจและไม่ได้ตั้งค่า
//True model data
var _test : Int = 0 {
//First this
willSet {
println("Old value is \(_test), new value is \(newValue)")
}
//value is set
//Finaly this
didSet {
println("Old value is \(oldValue), new value is \(_test)")
}
}
var test : Int {
get {
return _test
}
set (aNewValue) {
//I've contrived some condition on which this property can be set
if (aNewValue != test) {
_test = aNewValue
}
}
}
ที่นี่เราเห็น willSet และ didSet ขัดขวางการเปลี่ยนแปลงในคุณสมบัติที่จัดเก็บจริง สิ่งนี้มีประโยชน์สำหรับการส่งการแจ้งเตือนการซิงโครไนซ์ ฯลฯ ... (ดูตัวอย่างด้านล่าง)
ตัวอย่าง 5. ตัวอย่างคอนกรีต - คอนเทนเนอร์ ViewController
//Underlying instance variable (would ideally be private)
var _childVC : UIViewController? {
willSet {
//REMOVE OLD VC
println("Property will set")
if (_childVC != nil) {
_childVC!.willMoveToParentViewController(nil)
self.setOverrideTraitCollection(nil, forChildViewController: _childVC)
_childVC!.view.removeFromSuperview()
_childVC!.removeFromParentViewController()
}
if (newValue) {
self.addChildViewController(newValue)
}
}
//I can't see a way to 'stop' the value being set to the same controller - hence the computed property
didSet {
//ADD NEW VC
println("Property did set")
if (_childVC) {
// var views = NSDictionaryOfVariableBindings(self.view) .. NOT YET SUPPORTED (NSDictionary bridging not yet available)
//Add subviews + constraints
_childVC!.view.setTranslatesAutoresizingMaskIntoConstraints(false) //For now - until I add my own constraints
self.view.addSubview(_childVC!.view)
let views = ["view" : _childVC!.view] as NSMutableDictionary
let layoutOpts = NSLayoutFormatOptions(0)
let lc1 : AnyObject[] = NSLayoutConstraint.constraintsWithVisualFormat("|[view]|", options: layoutOpts, metrics: NSDictionary(), views: views)
let lc2 : AnyObject[] = NSLayoutConstraint.constraintsWithVisualFormat("V:|[view]|", options: layoutOpts, metrics: NSDictionary(), views: views)
self.view.addConstraints(lc1)
self.view.addConstraints(lc2)
//Forward messages to child
_childVC!.didMoveToParentViewController(self)
}
}
}
//Computed property - this is the property that must be used to prevent setting the same value twice
//unless there is another way of doing this?
var childVC : UIViewController? {
get {
return _childVC
}
set(suggestedVC) {
if (suggestedVC != _childVC) {
_childVC = suggestedVC
}
}
}
สังเกตการใช้ทั้งคุณสมบัติที่คำนวณและเก็บไว้ ฉันใช้คุณสมบัติที่คำนวณได้เพื่อป้องกันการตั้งค่าเดียวกันสองครั้ง (เพื่อหลีกเลี่ยงสิ่งเลวร้ายที่เกิดขึ้น!); ฉันใช้ willSet และ didSet เพื่อส่งต่อการแจ้งเตือนไปยัง viewControllers (ดูเอกสารประกอบ UIViewController และข้อมูลเกี่ยวกับคอนเทนเนอร์ viewController)
ฉันหวังว่าสิ่งนี้จะช่วยได้และช่วยให้ใครบางคนตะโกนถ้าฉันทำผิดที่ใดก็ได้ที่นี่!
get
และset
) มีพื้นจะมีทรัพย์สินที่คำนวณขึ้นอยู่กับทรัพย์สินของผู้อื่นเช่นการแปลงเป็นป้ายชื่อลงในปีtext
& จะมีการพูดว่า ... เฮ้ค่านี้ถูกตั้งค่าตอนนี้ลองทำเช่นแหล่งข้อมูลของเราได้รับการปรับปรุง ... ดังนั้นลองโหลด tableView อีกครั้งเพื่อที่จะรวมแถวใหม่ สำหรับตัวอย่างอื่นดูคำตอบของ dfri เกี่ยวกับวิธีโทรหาผู้ได้รับมอบหมายในInt
didSet
willSet
didSet