2015-12-18 3 views
2

Я не спрашиваю, являются ли эти расширения хорошей идеей или нет, это всего лишь мысленный эксперимент, который я пытаюсь извлечь из практики.Идиоматический способ тестирования Быстрые опции

Соглашаясь с Леттнер, что методы, как правило, предпочтительнее, я думал, что играть с возможность выразить:

someVariable.isNil 

и

someVariable.notNil 

Реализация его, я обнаружил любопытный если одна или другая из следующих реализаций была предпочтительнее другой и по каким причинам? Был бы более эффективен, чем другие. Будут ли краевые случаи лучше, так или иначе.

Решение 1:

extension Optional { 
    var isNil:Bool { 
     switch self { 
     case .None: 
      return true 
     case .Some: 
      return false 
     } 
    } 

    var notNil:Bool { 
     switch self { 
     case .None: 
      return false 
     case .Some: 
      return true 
     } 
    } 
} 

Решение 2:

extension Optional { 
    var isNil:Bool { 
     return self == nil 
    } 

    var notNil:Bool { 
     return self != nil 
    } 
} 
+0

Нет необходимости в переменной notNil, вы можете как пользователь (iVar.isNil) вместо iVar.notNil, это удалит еще одно вычисленное свойство notNil –

ответ

0

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

Взгляните на текущей реализации Дополнительно:

https://github.com/apple/swift/blob/ecd3c07a86394aa6b1372f1370f470842b39ea6e/stdlib/public/core/Optional.swift

В верхнем, вы можете увидеть, что его собственное наиболее примитивное представление использует .None и .some. Итак, Решение 1 - самый прямой подход, имеет наименьшие издержки и следует за шаблоном, используемым при реализации самого Факультативного. Я бы сказал, что это считается идиоматическим.

Использование operator == просто добавляет ненужную косвенность и даже не будет работать так, как вы ее представляли.

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