Эквивалент @property/@synthesize в swift

Раньше мы объявляли property для передачи данных между классами следующим образом:

.h file (interface file)
@property (nonatomic) double topSpeed;

.m file (implementation file)
@synthesize topSpeed;

Теперь нет класса interface, как передавать данные между классами .swift?


person Mutawe    schedule 03.06.2014    source источник
comment
Но вы не объясняете, вы говорите "We used to declare property to pass data between classes as following:", а затем ваш вопрос "Now there is no interface class, how to pass data between .swift classes ?" Где это объясняет?   -  person Popeye    schedule 03.06.2014


Ответы (6)


Swift не делает различий между свойствами и переменными экземпляра (т. е. базовым хранилищем для свойства). Чтобы определить свойство, вы просто объявляете переменную в контексте класса.

Класс Swift — это просто файл ClassName.swift.

Вы объявляете класс и свойства как

class SomeClass {

  var topSpeed: Double
  var aStrProperty: String
  var anIntProperty: Int

  //Initializers and other functions

}

Вы получаете доступ к значениям свойств через запись через точку. Начиная с Xcode6 beta 4, в Swift также есть модификаторы доступа (public, internal и private). По умолчанию каждое свойство равно internal. Дополнительную информацию см. здесь.

Для получения дополнительной информации см. Руководство по программированию на Swift:

Сохраненные свойства и переменные экземпляра

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

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

person Cezar    schedule 03.06.2014
comment
Спасибо! Я пытаюсь сделать это в этой нотации, но продолжаю получать сообщение об ошибке Class 'MyClass' has no initializers в строке объявления класса. - person Ruben Martinez Jr.; 17.07.2014
comment
@РубенМартинесДжр. Вам необходимо предоставить инициализатор или значения по умолчанию для каждого свойства. Приведенный выше код предназначен только для иллюстрации объявлений свойств. - person Cezar; 17.07.2014
comment
Можно ли переопределить их геттеры/сеттеры? Например, Obj-C @property (readwrite) Type *name поставляется с геттером name и сеттером setName, которые можно вызывать с помощью Type *newVar = holder.name; и holder.name = newVar; или Type *newVar = [holder name]; и [holder setName: newVar];. Это означает, что если я хочу добавить к ним особое поведение, все, что мне нужно сделать, это создать - (Type) name и - (void) setName: (Type *)newName;. (см. также stackoverflow.com/questions/6843125/custom-setter-for -property) Есть ли аналог этого в Swift? - person Ky Leggiero; 01.04.2015
comment
Я думаю, что это может быть неправильно, поскольку мы используем @synthesize для переименования переменной, если мы хотим изменить уровень доступа, в Objective-c есть другие способы, тогда мы можем сделать это по-другому. - person AMH; 16.09.2018

Использование свойств.

Из Руководство по программированию на Swift:

Сохраненные свойства и переменные экземпляра

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

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

person trojanfoe    schedule 03.06.2014

Свойства в Objective-C соответствуют свойствам в Swift. Есть два способа реализовать свойства в Objective-C и Swift:

  1. Синтезированные/автосинтезированные свойства в Objective C — в Swift они называются «сохраненными свойствами». Вы просто объявляете его с помощью var topSpeed : Double или let topSpeed : Double = 4.2 в объявлении класса точно так же, как вы объявляете локальную переменную в теле функции. Вы не можете указать имя резервной переменной экземпляра, потому что в настоящее время в Swift нет переменных экземпляра. Вы должны всегда использовать свойство вместо его резервной переменной экземпляра.
  2. Вручную реализованные свойства в Objective-C — в Swift они называются «вычисляемыми свойствами». Вы объявляете их в объявлении класса как var topSpeed : Double { get { getter code here } set { setter code here } } (для readwrite свойств) или var topSpeed : Double { getter code here } (для readonly свойств).
person newacct    schedule 10.06.2014

Похоже, что по крайней мере часть вашего вопроса относится к передаче интерфейса данного класса другим классам. Подобно Java (и в отличие от C, C++ и Objective-C), Swift не отделяет интерфейс от реализации. Вы не import заголовочный файл, если хотите использовать символы, определенные где-то еще. Вместо этого вы import создаете модуль, например:

import Foundation
import MyClass

Чтобы получить доступ к свойствам другого класса, импортируйте этот класс.

person Caleb    schedule 03.06.2014
comment
Если у вас есть такой класс, как MySimpleViewController.swift, вам НЕ нужно добавлять import MySimpleViewController. Xcode должен автоматически подобрать ваше определение класса. В бета-версии Xcode6 (6A215l) вы можете столкнуться с сообщением об ошибке, в котором говорится, что тип MySimpleViewController не объявлен при его использовании внутри определения другого класса. Просто обязательно очистите и перестройте свой проект: SHIFT+CMD+K и CMD+B - person Mieczysław Daniel Dyba; 08.06.2014

Сохраненные свойства и переменные экземпляра

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

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

Из книги по программированию Swift:

    struct FixedLengthRange {
    var firstValue: Int
    let length: Int
    }

    var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3)
person Erick Gonzales    schedule 23.07.2014

Я говорю: typealias эквивалентен еще больше в быстром для @synthesize

просто посмотрите на эту ссылку: https://docs.swift.org/swift-book/ReferenceManual/Declarations.html

введите здесь описание изображения

person AMH    schedule 16.09.2018