Swift 2: попробуйте/поймайте функцию не бросания

Я рефакторинг класса Obj-c, где был @try/@catch блок вокруг removeObserver:.

Выполнение такого же действия в быстрых запусках предупреждает, поскольку removeObserver может завершиться с ошибкой (когда нет наблюдателя), но он не вызывает никаких ошибок.

Любая идея, как я мог бы достичь такого же поведения?

edit: Мой код:

try {  
    self.removeObserver(self, forKeyPath: "LineDisplayChanged")
}

Ответ 1

Вы вызываете func removeObserver(_ anObserver: NSObject,forKeyPath keyPath: String) из протокола NSKeyValueObserving и не выбрасываете никаких исключений.

Кроме того, обратите внимание, что в Swift 2 синтаксис исключения (которые на самом деле являются подклассами перечисления ErrorType) изменился и теперь выглядит примерно так:

do{
   try functionThrowingExceptions()

}catch ErrorTypeSubclassEnum.Value {
   // Do something
}catch ErrorType {
   // Do something, catches everything else
}

Подробнее см. этот пост.

Примечание. Я использую KVO с последней бета-версией XCode7, делая self.removeObserver(self, forKeyPath: "path") не вызывает никаких ошибок/предупреждений.

Ответ 2

Чтобы удалить предупреждение, просто удалите try { }. removeObserver:forKeyPath: генерирует исключение, а не ошибку. И вы не можете перехватывать исключения в Swift, поэтому убедитесь, что вы вызываете этот метод только в том случае, если вы его наблюдаете, иначе он сработает, и в Swift его нет.

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