Swift: Computed property
Czym jest computed property?
Zmienna, która jest computed property działa na takiej zasadzie, że nie przechowuje wartości, tylko jest ona obliczana przy próbie odczytu.
Domyślnie udostępnia getter do pobierania wartości. Opcjonalnie można przypisać także setter jeśli chcemy przypisywać zmiennej wartość.
Computed property można użyć w klasie, strukturze, enum lub nawet poza wymienionymi.
Najprościej można stworzyć computed property, w taki sposób:
struct User {
var firstName: String;
var lastName: String;
var fullName: String {
return firstName + " " + lastName
}
}
var user = User(firstName: "James", lastName: "Bond");
print(user.fullName) // James Bond
Zmienna fullName jest typu: computed property. W momencie odwołania się do niej w kodzie jej wartość jest ustalana "w locie".
Zapis dla fullName można jeszcze skrócić:
var fullName: String {
firstName + " " + lastName
}
O ile w Swift nie jest wymagane określanie typu danych zmiennej lub stałej, to w przypadku computed property taki typ musi zostać podany.
Getter
Pobieranie wartości dla computed property można zdefiniować jeszcze w inny sposób:
var fullName: String {
get {
firstName + " " + lastName
}
}
Tylko po co tak pisać skoro można obyć się bez get?
Istnieje możliwość dodania setter'a dla computed property.
Setter
Jeśli chcesz zmienić wartość computed property musisz określić mu setter. Bez tego próba przypisania wartości spowoduje błąd.
struct Hotel {
var rooms: Int
var allocated: Int = 0
var roomsRemaining: Int {
get {
rooms - allocated
}
set {
rooms = allocated + newValue
}
}
}
var hotel = Hotel(rooms: 20)
print(hotel.roomsRemaining) // 20
hotel.allocated = 5
print(hotel.roomsRemaining) // 15
hotel.roomsRemaining = 10
print(hotel.rooms) // 15
print(hotel.roomsRemaining) // 10
Kiedy tego użyć?
Jeśli tworzysz zmienną, która zależy od wartości innej zmiennej, jest to sygnał, że warto zadeklarować ją jako computed property.
Z drugiej strony należy uważać, bo możemy przesadzić. Wartość computed property jest obliczana za każdym razem, gdy pobierana jest z niej wartość. Więc jeśli umieścisz w takiej zmiennej kosztowne operacje, zapłacisz spadkiem wydajności aplikacji.