Re: Translating KVO-ed property to Swift
Re: Translating KVO-ed property to Swift
- Subject: Re: Translating KVO-ed property to Swift
- From: Rick Mann <email@hidden>
- Date: Mon, 17 Apr 2017 14:23:55 -0700
Thanks, Charles, that's helpful. In the end I left the class as Obj-C, because I still had to derive from it in Obj-C and you annoyingly can't do that.
> On Apr 17, 2017, at 08:06 , Charles Srstka <email@hidden> wrote:
>
>> On Apr 17, 2017, at 3:24 AM, Rick Mann <email@hidden> wrote:
>>
>> I have a number of properties in Objective-C written like this, short-circuiting notifications when the value doesn't change:
>>
>> -------------
>> @synthesize version = mVersion
>>
>> - (void)
>> setVersion: (NSString *) inVersion
>> {
>> if (inVersion == nil && mVersion == nil)
>> {
>> return;
>> }
>> if ([inVersion isEqualToString: mVersion])
>> {
>> return;
>> }
>>
>> [self willChangeValueForKey: @"version"];
>> mVersion = inVersion;
>> [self didChangeValueForKey: @"version"];
>> }
>> -------------
>>
>> Now I want to translate this method into Swift. Thing is, AFAIK you can't name the ivar created for a property. Is there a way to translate this to swift?
>
> I’ve been converting a lot of KVO properties to Swift lately. Here’s how I’d do this:
>
> // Only needed if the property will be accessed by Objective-C code, since Swift code won’t see the swizzled accessors anyway for a non-dynamic property.
> // @objc annotation is needed on every method we write here, since otherwise it’ll quit working when @objc inference is removed in Swift 4 (SE-0160)
> @objc private static let automaticallyNotifiesObserversOfVersion: Bool = false
>
> // Our actual version property. If you want, you can create a private property named “mVersion” and it will function like an instance variable.
> // But I’d probably just use willSet and didSet.
> // Note that this doesn’t need to be dynamic, since we are not relying on Cocoa’s built-in automatic swizzling,
> // which is only needed if we are not calling willChangeValue(forKey:) and didChangeValue(forKey:) ourselves.
> @objc var version: String {
> willSet {
> // Send the willChange notification, if the value is different from its old value.
> if newValue != self.version {
> self.willChangeValue(forKey: #keyPath(version))
> }
> }
> didSet {
> // Send the didChange notification, if the value is different from its old value.
> if oldValue != self.version {
> self.didChangeValue(forKey: #keyPath(version))
> }
> }
> }
>
> Charles
>
--
Rick Mann
email@hidden
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden