2016-07-19 1 views
4

У меня есть блок простого кода, вычисляющий площадь & периметр ромба.Как использовать get и установить в Swift

var perimeterOfRhombus: Double { 
     get { 
      let twoSides1 = sideLength1 + sideLength1 
      let twoSides2 = sideLength2 + sideLength2 
      let finalPerimeter = twoSides1 + twoSides2 
      return finalPerimeter 
     } set { 
     } 
    } 

Что мне недостает, так это раздел.

Я хочу, чтобы он показывал, какие стороны Length1 и sideLength2 были в начале.

Я не уверен, для чего используется newValue, когда он не имеет значения.

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

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

+1

Не путайте свой особый пример с общим случаем. Что бы установить область ромба mean/do, логично ли это? Вряд ли. Таким образом, ваш var должен быть действительно доступен только для чтения и не имеет сеттера – Wain

+0

Сравните http://stackoverflow.com/questions/29690521/set-value-to-computed-properties-in-swift для аналогичного вопроса. –

ответ

13

Вы должны ссылаться на Вычислимые свойства только для чтения вместо вычисляемых свойств.

Вычисленное свойство с геттером, но без сеттера известно как вычислимое свойство только для чтения. Оно всегда возвращает значение и не может быть установлено на другое значение.

var perimeterOfRhombus: Double { 
    let twoSides1 = sideLength1 + sideLength1 
    let twoSides2 = sideLength2 + sideLength2 
    let finalPerimeter = twoSides1 + twoSides2 
    return finalPerimeter 
} 

Вычислимые свойства фактически не сохраняют значение. Вместо этого они предоставляют геттер и дополнительный сеттер для извлечения и установки других свойств и значений косвенно.

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

struct Square { 
    var edge: Double = 0 

    var area: Double { 
    get { 
     return edge * edge 
    } 
    set (newArea){ 
     edge = sqrt(newArea) 
    } 
    } 
} 

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

О newValue, это называется Shorthand сеттер Декларация - Если сеттер вычисленного ресурса не определить имя для нового значения нужно задать имя newValue по умолчанию используется.

Таким образом, приведенный выше пример становится

struct Square { 
    var edge: Double = 0 

    var area: Double { 
    get { 
     return edge * edge 
    } 
    set { 
     edge = sqrt(newValue) //someSquare.area = 25 (25 is newValue) 
    } 
    } 
} 
+1

Спасибо за 'set (...)', что просвело меня :) – LinusGeffarth