2016-01-14 4 views
2

Я пытаюсь реализовать некоторые правила валидации в методах наблюдения свойств (didSet и willSet), и я пытаюсь использовать throw внутри закрытия. Вот наглядный пример:Ошибки метаданных в методах наблюдателя в Swift

enum SomeClassError: ErrorType { 
    case NumberNotPositive 
} 

class SomeClass { 
    var PositiveNumber: Int { 
    willSet(value) { 
     guard value > 0 else { 
     throw SomeClassError.NumberNotPositive 
     } 
    } 
    } 
} 

Конечно, компилятор жалуется, что Error is not handled because the enclosing function is not declared 'throws', и я действительно не знаю, где заявить, что на самом деле didSetthrows.

Знаете ли вы, есть ли способ выбросить ошибки в методы наблюдения за собственностью?

+0

укажите, пожалуйста, ваш код –

+0

Я не верю, что есть. Когда свойство получает или задает, вызывающий код не ожидает, что какие-либо ошибки будут выброшены, поэтому наблюдатель должен обрабатывать все ошибки. –

+0

Если вы пытаетесь выполнить проверку с использованием наблюдателя свойств, вы можете либо вернуться к старому значению, либо сбросить свойство до некоторого значения дозорного. –

ответ

1

Вы можете вызвать функцию в вашей наблюдателя свойства do-try-catch`, которая вызывает, например.

enum SomeClassError: ErrorType { 
    case NumberNotPositive 
} 

class SomeClass { 
    var positiveNumber: Int { 
     willSet { 
      do { 
       try newValueIsPositive(newValue) 
      } catch SomeClassError.NumberNotPositive { 
       print("Error: Number not positive") 
      } catch { 
       print("Error: Unknown error") 
      } 
     } 
    } 

    init() { 
     positiveNumber = 1 
    } 

    func newValueIsPositive(newValue: Int) throws { 
     guard newValue > 0 else { 
      throw SomeClassError.NumberNotPositive 
     } 
    } 
} 

/* Example */ 
var a = SomeClass() 
a.positiveNumber = 2 
a.positiveNumber = -1 // Error: Number not positive 
print(a.positiveNumber) // -1 

Обратите внимание, что я использовал newValue свойство, доступную по умолчанию при использовании willSet свойств наблюдателя (а не явного определения имени свойства value для значения, которое будет установлено после willSet). Также обратите внимание, что в вашей текущей форме свойство класса positiveNumber по-прежнему получает -1 (хотя в этом случае бросается случай).

+0

Этот код не останавливает 'positiveNumber' из допущения недопустимого значения. Одна из возможных попыток добиться этого - превратить 'willSet' в' didSet', вызвать 'newValueIsPositive (positiveNumber)' и добавить в конце каждого блока 'catch'' positiveNumber = oldValue'. – catalandres

+0

@catalandres Вы правы в этом, так как я действительно добавлял такой отказ от ответственности непосредственно перед вашим комментарием здесь :) Поскольку вопрос заключается в том, чтобы бросать ошибки в наблюдателях свойств, я буду рассматривать только эту проблему (отметив, однако, что отказ от ответственности) , Но, действительно, кажется, что теперь вы можете понять, что вы сейчас заработали! – dfri

+0

Что делать, если вы делаете * не * хотите, чтобы скрыть эту ошибку, но довести ее до клиента? – CTMacUser

Смежные вопросы