আমার বোধগম্যটি হ'ল সেট করা এবং গণনা করা সম্পত্তিগুলির জন্য ( সঞ্চিত বৈশিষ্ট্য থেকে কোনও ব্যাক আপ নেই )
যদি আপনি কোনও উদ্দেশ্য-সি থেকে আগত হন তবে মনে রাখবেন যে নামকরণের কনভেনশনগুলি পরিবর্তিত হয়েছে। সুইফ্টে একটি আইভার বা উদাহরণ ভেরিয়েবলের নাম রাখা হয় সঞ্চিত সম্পত্তি
উদাহরণ 1 (কেবলমাত্র সম্পত্তি পড়ুন) - সতর্কতা সহ:
var test : Int {
get {
return test
}
}
এটি একটি সতর্কবার্তার ফলস্বরূপ ঘটবে কারণ এর ফলে পুনরাবৃত্তির ফাংশন কল আসে (গ্রাহক নিজে কল করে) thisএ ক্ষেত্রে সতর্কতাটি হ'ল "তার নিজের গেটারের মধ্যে 'পরীক্ষা' সংশোধন করার চেষ্টা করা হচ্ছে"।
উদাহরণ 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
}
}
}
অনুরূপ সমস্যা - এটি পুনরাবৃত্তভাবে সেটারকে কল করার কারণে আপনি এটি করতে পারবেন না । এছাড়াও, নোট করুন যে এই কোডটি কোনও আরম্ভকারীদের সম্পর্কে অভিযোগ করবে না কারণ সূচনা করার জন্য কোনও সঞ্চিত সম্পত্তি নেই ।
উদাহরণ ৩. গণনা করা সম্পত্তি পড়ুন / লিখুন - ব্যাকিং স্টোর সহ
এখানে এমন একটি প্যাটার্ন দেওয়া হয়েছে যা প্রকৃত সঞ্চিত সম্পত্তির শর্তসাপেক্ষে সেটিংসের অনুমতি দেয়
//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
}
}
}
দ্রষ্টব্য প্রকৃত ডেটাটিকে _ টেস্ট বলা হয় (যদিও এটি কোনও ডেটা বা ডেটার সংমিশ্রণ হতে পারে) এছাড়াও প্রাথমিক মান সরবরাহ করার প্রয়োজনীয়তাটিও নোট করুন (বিকল্পভাবে আপনাকে একটি init পদ্ধতি ব্যবহার করা দরকার) কারণ _তাই আসলে একটি উদাহরণ পরিবর্তনশীল
উদাহরণ 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
}
}
}
এখানে আমরা উইলসেট এবং ডেটসেট দেখতে পাই যা প্রকৃত সঞ্চিত সম্পত্তির পরিবর্তনকে আটকাচ্ছে। এটি বিজ্ঞপ্তিগুলি, সিঙ্ক্রোনাইজেশন ইত্যাদি প্রেরণের জন্য দরকারী (নীচে উদাহরণ দেখুন)
উদাহরণ 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
}
}
}
দুটি গণিত এবং সঞ্চিত বৈশিষ্ট্য ব্যবহার নোট করুন। দু'বার একই মান সেট করা থেকে বিরত রাখতে আমি একটি গণিত সম্পত্তি ব্যবহার করেছি (খারাপ জিনিস যাতে না ঘটে সে জন্য!); আমি ভিউ কনট্রোলারগুলিতে বিজ্ঞপ্তি ফরোয়ার্ড করতে উইলসেট এবং ডুডসেট ব্যবহার করেছি (দেখুন ইউআইভিউউকন্ট্রোলার ডকুমেন্টেশন এবং ভিউকন্ট্রোলার ধারকগুলিতে তথ্য)
আমি আশা করি এটি সাহায্য করে, এবং দয়া করে কেউ এখানে চিত্কার করে যদি আমি কোথাও কোনও ভুল করে থাকি!
get
&set
) মূলত অন্য কোনও সম্পত্তির উপর ভিত্তি করে একটি সম্পত্তি গণনা করা হয়, যেমন একটি লেবেলকেtext
এক বছরে রূপান্তর করেInt
।didSet
&willSet
সেখানে বলার আছে ... আরে এই মানটি সেট করা হয়েছিল, এখন এটি করা যাক উদাহরণস্বরূপ আমাদের ডাটাসোর্স আপডেট করা হয়েছিল ... সুতরাং টেবিলভিউটি পুনরায় লোড করুন যাতে এটিতে নতুন সারি অন্তর্ভুক্ত থাকে। অন্য উদাহরণের জন্য ডেলিফ্রির উত্তরdidSet