Swift Language
Zmienne i właściwości
Szukaj…
Uwagi
Właściwości : skojarzony z typem
Zmienne : Nie są powiązane z typem
Aby uzyskać więcej informacji, zobacz Swift Programming Language iBook .
Tworzenie zmiennej
Zadeklaruj nową zmienną za pomocą var
, a następnie nazwę, typ i wartość:
var num: Int = 10
Zmienne mogą mieć zmienione wartości:
num = 20 // num now equals 20
Chyba że są zdefiniowane przez let
:
let num: Int = 10 // num cannot change
Swift określa typ zmiennej, więc nie zawsze musisz deklarować typ zmiennej:
let ten = 10 // num is an Int
let pi = 3.14 // pi is a Double
let floatPi: Float = 3.14 // floatPi is a Float
Nazwy zmiennych nie są ograniczone do liter i cyfr - mogą również zawierać większość innych znaków Unicode, chociaż istnieją pewne ograniczenia
Nazwy stałych i zmiennych nie mogą zawierać znaków białych znaków, symboli matematycznych, strzałek, punktów kodu Unicode prywatnego użytku (lub nieprawidłowych) ani znaków rysujących linie i ramki. Nie mogą też zaczynać się od cyfry
Źródło developer.apple.com
var π: Double = 3.14159
var 🍎🍏: String = "Apples"
Podstawy nieruchomości
Właściwości mogą być dodawane do klasy lub struktury (również technicznie wylicza , patrz przykład „Obliczone właściwości”). Dodają wartości, które są powiązane z instancjami klas / struktur:
class Dog {
var name = ""
}
W powyższym przypadku instancje Dog
mają właściwość o nazwie name
typu String
. Dostęp do właściwości i modyfikacja można uzyskać w instancjach Dog
:
let myDog = Dog()
myDog.name = "Doggy" // myDog's name is now "Doggy"
Tego rodzaju właściwości są uważane za przechowywane , ponieważ przechowują coś w obiekcie i wpływają na jego pamięć.
Leniwe przechowywane właściwości
Leniwe przechowywane właściwości mają wartości, które nie są obliczane do pierwszego dostępu. Jest to przydatne do oszczędzania pamięci, gdy obliczenia zmiennej są drogie obliczeniowo. Zadeklarujesz leniwą właściwość za pomocą lazy
:
lazy var veryExpensiveVariable = expensiveMethod()
Często przypisywany jest do wartości zwracanej zamknięcia:
lazy var veryExpensiveString = { () -> String in
var str = expensiveStrFetch()
str.expensiveManipulation(integer: arc4random_uniform(5))
return str
}()
Leniwe przechowywane właściwości należy zadeklarować za pomocą var
.
Obliczone właściwości
W odróżnieniu od przechowywanych właściwości, obliczone właściwości są budowane za pomocą modułu pobierającego i ustawiającego, wykonując niezbędny kod podczas uzyskiwania dostępu i ustawiania. Obliczone właściwości muszą definiować typ:
var pi = 3.14
class Circle {
var radius = 0.0
var circumference: Double {
get {
return pi * radius * 2
}
set {
radius = newValue / pi / 2
}
}
}
let circle = Circle()
circle.radius = 1
print(circle.circumference) // Prints "6.28"
circle.circumference = 14
print(circle.radius) // Prints "2.229..."
Właściwość obliczona tylko do odczytu jest nadal deklarowana za pomocą var
:
var circumference: Double {
get {
return pi * radius * 2
}
}
Właściwości obliczone tylko do odczytu można skrócić, aby wykluczyć get
:
var circumference: Double {
return pi * radius * 2
}
Zmienne lokalne i globalne
Zmienne lokalne są zdefiniowane w ramach funkcji, metody lub zamknięcia:
func printSomething() {
let localString = "I'm local!"
print(localString)
}
func printSomethingAgain() {
print(localString) // error
}
Zmienne globalne są zdefiniowane poza funkcją, metodą lub zamknięciem i nie są zdefiniowane w ramach typu (należy myśleć poza wszystkimi nawiasami). Można ich używać wszędzie:
let globalString = "I'm global!"
print(globalString)
func useGlobalString() {
print(globalString) // works!
}
for i in 0..<2 {
print(globalString) // works!
}
class GlobalStringUser {
var computeGlobalString {
return globalString // works!
}
}
Zmienne globalne są definiowane leniwie (patrz przykład „Leniwe właściwości”).
Wpisz właściwości
Właściwości typu są właściwościami samego typu, a nie instancji. Mogą to być zarówno właściwości zapisane, jak i obliczone. Deklarujesz właściwość type ze static
:
struct Dog {
static var noise = "Bark!"
}
print(Dog.noise) // Prints "Bark!"
W klasie można użyć słowa kluczowego class
zamiast static
aby można było go zastąpić. Można to jednak zastosować tylko do obliczonych właściwości:
class Animal {
class var noise: String {
return "Animal noise!"
}
}
class Pig: Animal {
override class var noise: String {
return "Oink oink!"
}
}
Jest to często używane w przypadku wzoru singleton .
Obserwatorzy nieruchomości
Obserwatorzy właściwości reagują na zmiany wartości właściwości.
var myProperty = 5 {
willSet {
print("Will set to \(newValue). It was previously \(myProperty)")
}
didSet {
print("Did set to \(myProperty). It was previously \(oldValue)")
}
}
myProperty = 6
// prints: Will set to 6, It was previously 5
// prints: Did set to 6. It was previously 5
-
willSet
jest wywoływana przedmyProperty
jest ustawiony. Nowa wartość jest dostępna jakonewValue
, a stara wartość jest nadal dostępna jakomyProperty
. -
didSet
nazywa pomyProperty
jest ustawiony. Stara wartość jest dostępna jakooldValue
, a nowa wartość jest teraz dostępna jakomyProperty
.
Uwaga:
didSet
iwillSet
nie będą wywoływane w następujących przypadkach:
- Przypisywanie wartości początkowej
- Modyfikowanie zmiennej w ramach własnego
didSet
lubwillSet
- Nazwy parametrów dla
oldValue
inewValue
didSet
iwillSet
można również zadeklarować w celu zwiększenia czytelności:
var myFontSize = 10 {
willSet(newFontSize) {
print("Will set font to \(newFontSize), it was \(myFontSize)")
}
didSet(oldFontSize) {
print("Did set font to \(myFontSize), it was \(oldFontSize)")
}
}
Przestroga: Chociaż można zadeklarować nazwy parametrów ustawiających, należy zachować ostrożność, aby nie mieszać nazw:
willSet(oldValue)
ididSet(newValue)
są całkowicie legalne, ale znacznie dezorientują czytelników twojego kodu.