Swift Language
Классы
Поиск…
замечания
init()
- это специальный метод в классах, который используется для объявления инициализатора для класса. Более подробную информацию можно найти здесь: Инициализаторы
Определение класса
Вы определяете класс следующим образом:
class Dog {}
Класс также может быть подклассом другого класса:
class Animal {}
class Dog: Animal {}
В этом примере Animal
также может быть протоколом, который соответствует Dog
.
Справочная семантика
Классы являются ссылочными типами , что означает, что несколько переменных могут ссылаться на один и тот же экземпляр.
class Dog {
var name = ""
}
let firstDog = Dog()
firstDog.name = "Fido"
let otherDog = firstDog // otherDog points to the same Dog instance
otherDog.name = "Rover" // modifying otherDog also modifies firstDog
print(firstDog.name) // prints "Rover"
Поскольку классы являются ссылочными типами, даже если класс является константой, его свойства переменной все еще могут быть изменены.
class Dog {
var name: String // name is a variable property.
let age: Int // age is a constant property.
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
let constantDog = Dog(name: "Rover", age: 5)// This instance is a constant.
var variableDog = Dog(name: "Spot", age 7)// This instance is a variable.
constantDog.name = "Fido" // Not an error because name is a variable property.
constantDog.age = 6 // Error because age is a constant property.
constantDog = Dog(name: "Fido", age: 6)
/* The last one is an error because you are changing the actual reference, not
just what the reference points to. */
variableDog.name = "Ace" // Not an error because name is a variable property.
variableDog.age = 8 // Error because age is a constant property.
variableDog = Dog(name: "Ace", age: 8)
/* The last one is not an error because variableDog is a variable instance and
therefore the actual reference can be changed. */
Проверьте, идентичны ли два объекта (укажите один и тот же экземпляр) с помощью ===
:
class Dog: Equatable {
let name: String
init(name: String) { self.name = name }
}
// Consider two dogs equal if their names are equal.
func ==(lhs: Dog, rhs: Dog) -> Bool {
return lhs.name == rhs.name
}
// Create two Dog instances which have the same name.
let spot1 = Dog(name: "Spot")
let spot2 = Dog(name: "Spot")
spot1 == spot2 // true, because the dogs are equal
spot1 != spot2 // false
spot1 === spot2 // false, because the dogs are different instances
spot1 !== spot2 // true
Свойства и методы
Классы могут определять свойства, которые могут использовать экземпляры класса. В этом примере у Dog
есть два свойства: name
и dogYearAge
:
class Dog {
var name = ""
var dogYearAge = 0
}
Вы можете получить доступ к свойствам с помощью синтаксиса точек:
let dog = Dog()
print(dog.name)
print(dog.dogYearAge)
Классы могут также определять методы, которые могут быть вызваны в экземплярах, они объявляются аналогичными нормальным функциям , только внутри класса:
class Dog {
func bark() {
print("Ruff!")
}
}
В методах вызова используется также точечный синтаксис:
dog.bark()
Классы и множественное наследование
Swift не поддерживает множественное наследование. То есть вы не можете наследовать более одного класса.
class Animal { ... }
class Pet { ... }
class Dog: Animal, Pet { ... } // This will result in a compiler error.
Вместо этого вам рекомендуется использовать композицию при создании ваших типов. Это можно сделать с помощью протоколов .
Deinit
class ClassA {
var timer: NSTimer!
init() {
// initialize timer
}
deinit {
// code
timer.invalidate()
}
}