2016-07-18 5 views
1

В любом случае, чтобы вернуть себе собственность в геттер и установить себя на сеттер? Потому что я просто хочу распечатать журнал внутри геттера и сеттера, и это он.Swift - возвращает себя на геттер и устанавливает себя на сеттер

Например, я пытаюсь сделать что-то вроде этого:

private(set) var internetConnectionAvailable: Bool { 
    get { 
     logger.debug("verifying internet connection") 
     // here return itself property 
    } 
    set { 
     logger.debug("changing internet connection") 
     // here set itself 
    } 
} 

Если я вернусь self.internetConnectionAvailable на поглотителе я получаю:

команда Linker потерпела неудачу с кодом выхода 1

когда я пытаюсь скомпилировать проект.

Я пытаюсь сделать это, потому что я не хочу создавать дополнительную частную собственность для хранения get и set. Я смотрю, есть ли что-то другое для достижения этого.

+0

Звучит как проблема с компоновщиком. Можете ли вы добавить всю ошибку? – Mark

ответ

3

EDIT: Я отмечаю, что вы сказали, что не хотите создавать дополнительную частную собственность. Тогда извини. Нет. Если вы не сделаете это подклассом NSManagedObject (и зацепите его в систему willAccessValueForKey) или иным образом подключаетесь к среде выполнения ObjC на NSObject (вы могли бы swizzle ваш собственный getter, например, чтобы добавить журнал, не смейтесь, я сделал это раньше). Но все эти подходы безумны в Swift (и безумны в ObjC, я использовал их только для отладки). Просто сделайте опорную переменную.

Если вы хотите только зарегистрировать сеттер, то это будет просто: используйте willSet, а не set. Но для регистрации геттера необходимо выполнить все это вручную. Вы делаете это с помощью частной поддержки.

private var _internetConnectionAvailable: Bool 
private(set) var internetConnectionAvailable: { 
    get { 
     logger.debug("verifying internet connection") 
     return _internetConnectionAvailable 
    } 
    set { 
     logger.debug("changing internet connection") 
     _internetConnectionAvailable = newValue 
    } 
} 

После того, как вы определяете get себя, вы сказали, что вы не хотите обработку по умолчанию, который означает, что вы не получаете автоматическую переменную подкладочный.

0

Это действительно Swift без собственности основы:

private(set) var internetConnectionAvailable: Bool { 
    get { 
     print("verifying internet connection") 
     // here return itself property 
     return false 
    } 
    set { 
     print("changing internet connection") 
     // here set itself 
    } 
} 

Просто необходимо указать тип и возврат false из get.

+0

Извините, я забыл добавить тип Bool в вопрос. – pableiros

+0

Я немного смущен тем, как это будет работать. Разве это не вызовет бесконечный цикл получения/настройки? – tktsubota

+0

Нет, когда вы устанавливаете свойство, ничего не происходит (кроме вашего журнала), и когда вы получаете свойство, всегда возвращается false (и ваш другой журнал печатается). – Mark