2016-08-31 3 views
1

У меня есть свойство объекта класса с именем object, а - логическая переменная readonly с именем isEmpty. Если для свойства объекта задан некоторый объект, свойство isEmpty переключается на значение false, и если объект установлен как nil, isEmpty устанавливается как true. Я могу достичь этого, используя Objective-C следующим образом:Установить зависимую переменную свойства с помощью настраиваемого метода настройки для объекта в Swift

@interface SomeObject: NSObject 

@property (nonatomic, strong) id object; 
@property (nonatomic, assign, readonly) BOOL isEmpty; 

@end 

@implementation SomeObject 

- (void)object:(id)object { 
    _isEmpty = NO; 
    _object = object; 
} 

- (id)object { 
    return _object; 
} 

- (void)clearObject { 
    _object = nil; 
    _isEmpty = YES; 
} 

@end 

Как я могу подражать этому в Swift 2.2? До сих пор я пробовал

class SomeObject: NSObject { 
    public private(set) var isEmpty: Bool 
    var nodeObject: AnyObject? = { 
     get { 
      isEmpty = false 
      return object 
     } 
     set(_object: AnyObject) { 
      object = _object 
     } 
    } 
} 

Но он не работает, как и ожидалось! Я знаю, что это неправильно, но не уверен в какой части!

ТИА

+3

Сделайте 'nodeObject' a * optional * и удалите другие вещи ... –

+0

@MartinR Спасибо! – Shabib

ответ

1

Если у вас есть абсолютное требование, чтобы установить IsEmpty, я бы об этом так: создать геттер для IsEmpty и проверить, является ли nodeObject равна нулю в поглотителе:

class SomeObject { 
    var isEmpty: Bool { 
    get { 
     return nodeObject == nil 
    } 
    } 
    var nodeObject: AnyObject? 
} 

См скрипку: http://swiftlang.ng.bluemix.net/#/repl/57c73513458cfba6715ebebd

EDIT: Если вы действительно хотите получить его близко к Objective-C, я предлагаю эту версию:

class SomeObject { 
    private var _isEmpty: Bool = true 
    var isEmpty: Bool { 
     get { 
      return _isEmpty 
     } 
    } 
    var nodeObject: AnyObject? { 
     didSet { 
      _isEmpty = nodeObject == nil 
     } 
    } 
} 

Fiddle: https://swiftlang.ng.bluemix.net/#/repl/57c738b646a02c0452203f98

+0

Лучшая идея, огромное спасибо! Но isEmpty должно быть свойство readonly. – Shabib

+0

@Shahib, isEmpty is readonly в моем примере (нет сеттера). Тем не менее, в вашем он читает/пишет. –

+0

Извините, о типографии, я обновил вопрос. Я думал, пример Objective-C прояснит ситуацию. В любом случае, спасибо человеку! – Shabib

1

бы эта работа для вас ?:

class SomeObject: NSObject { 
    var isEmpty: Bool 
    var nodeObject: AnyObject? { 
     didSet { 
      if nodeObject != nil { 
       isEmpty = false 
      } else { 
       isEmpty = true 
      } 
     } 
    } 
} 
+0

Спасибо! Оно работает! – Shabib

+0

isEmtpy is not readonly –

0

Попробуйте это для SWIFT 2 версии:

class SomeObject: NSObject { 
    var object: AnyObject? { 
     return object 
    } 
    private(set) var isEmpty = false 


    func object(object: AnyObject) { 
     self.isEmpty = false 
     self.object = object! 
    } 

    func clearObject() { 
     self.object = nil 
     self.isEmpty = true 
    } 
} 
Смежные вопросы