2017-01-07 2 views
0

Я новичок в программировании Ios в быстром 3. Мне интересно, зачем нужно создавать частные VAR в getter и setter внутри класса? И что произойдет, если я не добавлю эти 2 приватных (var)?Зачем нужно добавить 2 частных var в этом классе?

class Person { 
    private var _firstname: String! 
    private var _lastname: String! 

    var firstname: String { 
     return _firstname 
    } 

    var lastname: String { 
     return _lastname 
    } 

    var fullname: String { 
     return "\(firstname) \(lastname)" 
    } 
} 

ответ

1

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

Предположительно, _firstname и _lastname установлены в инициализаторе, который не показан. Как только частные переменные установлены, они не могут быть изменены никакими общедоступными методами.

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

1
  1. Это не быстро 3.0. Это быстро 2.3.
  2. Вам не обязательно. Пример, где переменная переменная не имеет «частный (вар)»:

    class Person { 
        private var variable: String = "" // you need to initialize it 
        private var _variable2: String? 
    
        var variable2: String { 
         get { 
          return _variable2 ?? "no value" // returns value or "no value" string 
         } 
         set { 
          self._variable2 = newValue 
         } 
        } 
    
    
    } 
    
3

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

class Person { 
    private(set) var firstname: String! 
    private(set) var lastname: String! 

    var fullname: String { 
     return "\(firstname ?? "") \(lastname ?? "")" 
    } 
} 

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

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

struct Person { 
    let firstname: String! 
    let lastname: String! 

    var fullname: String { 
     return "\(firstname ?? "") \(lastname ?? "")" 
    } 
} 

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

Часто при работе с контактами вы должны рассмотреть ситуацию, когда они могут быть nil. В этом случае я бы не сделал их неявно развернутыми опциями (например, я мог бы использовать ?, а не !). Или, если они не могут быть nil, я бы поставил их в инициализаторе, а затем не сделал их необязательными. Все зависит от бизнес-правил, которые вы собираетесь использовать с этим определением. Я собираюсь предположить, что у вас есть веская причина сделать эти неявно развернутые варианты, но для будущих читателей я бы только предупредил, что следует опасаться использовать неявно развернутые опции слишком случайно.

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