Задайте значение для вычисленных свойств в SWIFT

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

 class ViewController: UIViewController {
        var width : Int = 20
        var height : Int = 400
        var area: Int{
            get{
                return width * height
            }set(newarea){
                area = newarea*10
          //these line gives me an warning and area is not set
            }
        }

        override func viewDidLoad() {
            super.viewDidLoad()
            println("\(width)")
            println("\(height)")
            println("\(area)") 
         //  gives an error while setting value to computed properties...       area = 5000
         //  for that we need getter and setter properties in area...
            area = 490
            println("the new area for computed properties is as \(area)")
        }

EDIT: однако я понял, что могу изменить другие свойства вычисляемых свойств, из которых он получен как

set(newValue){
           // self.area = newValue
            width = newValue/10
            println("the new width for computed properties is as \(width)")
        }
    }

Но что, если я хочу изменить вычисленное свойство iteself

Ответ 1

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

И это не имеет смысла: если область может быть установлена ​​на другое значение, каков должен быть приемный метод? Это новое значение или width*height?

Поэтому, скорее всего, вы хотите вычислить свойство только для чтения для области:

var area: Int {
    get {
        return width * height
    }
}

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

class Rectangle {
    var width : Int = 20
    var height : Int = 400

    var area: Int {
        get {
            return width * height
        }
        set(newArea){
            // Make it a square with the approximate given area:
            width = Int(sqrt(Double(newArea)))
            height = width
        }
    }
}

Но даже тогда результаты могут быть неожиданными (из-за целочисленного округления):

let r = Rectangle()
r.area = 200
println(r.area) // 196

Ответ 2

Я думаю, вы неправильно понимаете концепцию вычисленного свойства. По определению, вычисленное свойство - это значение, значение которого вы не можете установить, потому что, ну, оно вычисляется. Он не имеет независимого существования. Цель установщика в вычисленном свойстве - не устанавливать значение свойства, а устанавливать значения других свойств, из которых вычисляется вычисляемое свойство. Возьмем, к примеру, квадрат. Его длина стороны - это свойство var s, а площадь - это вычисленное свойство, getter которого возвращает s * s, а сеттер устанавливает s как квадратный корень newValue (новая область). Установщик не устанавливает область. Он устанавливает длину стороны, из которой область будет вычисляться при следующем доступе к свойству области.

Ответ 3

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

struct Point {
    var x = 0.0 ,y = 0.0
}

struct Shape {
    var origin = Point()
    var centre : Point {
        get {
            return Point (x:origin.x/2 y:origin.y/2)
        }

        set(newCentre) {
            origin.x = newCentre.x/2
            origin.y = newCentre.y/2
        }
    }
}

Структура Shape определяет пользовательский метод получения и установки для вычисляемой переменной с именем Center. The Center   свойство затем получает доступ через синтаксис точки, что приводит к вызову метода получения для центра и извлекает текущее значение свойства. Вместо того, чтобы возвращать существующее значение, метод получения фактически вычисляет и возвращает новую точку, представляющую центр фигуры.        Если средство вычисления свойств Computed не определяет имя для нового устанавливаемого значения, используется имя по умолчанию "newValue".   Ниже представлена альтернативная версия структуры Rect, которая использует эту сокращенную запись.

struct Point {
    var x = 0.0
    var y = 0.0
}

struct Shape {
    var origin = Point()
    var centre : Point {
        get {
            return Point (x:origin.x/2 y:origin.y/2)
        }

        set(newCentre) {
            origin.x = newValue.x/2
            origin.y = newValue.y/2
        }
    }
}

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