Swift Language
変数とプロパティ
サーチ…
備考
変数の作成
var
で新しい変数を宣言し、その後に名前、型、および値を指定します。
var num: Int = 10
変数の値を変更することができます:
num = 20 // num now equals 20
let
定義されていない限り:
let num: Int = 10 // num cannot change
Swiftは変数の型を推定します。したがって、常に変数型を宣言する必要はありません。
let ten = 10 // num is an Int
let pi = 3.14 // pi is a Double
let floatPi: Float = 3.14 // floatPi is a Float
変数名は文字と数字に制限されていません - いくつかの制限がありますが、ほとんどの他のUnicode文字も含めることができます
定数および変数名には、空白文字、数学記号、矢、私用(または無効な)Unicodeコードポイント、または線と箱の描画文字を含めることはできません。彼らは数字で始めることもできません
var π: Double = 3.14159
var 🍎🍏: String = "Apples"
プロパティの基本
クラスや構造体にプロパティを追加することもできます(技術的にはenumもあります、「計算されたプロパティ」の例を参照)。これらは、クラス/構造体のインスタンスに関連する値を追加します。
class Dog {
var name = ""
}
上記の場合、 Dog
インスタンスには、 String
型のname
というname
のプロパティがあります。このプロパティは、 Dog
インスタンスでアクセスおよび変更できます。
let myDog = Dog()
myDog.name = "Doggy" // myDog's name is now "Doggy"
これらのタイプのプロパティは、オブジェクトに何かを格納してメモリに影響を及ぼすため、 ストアドプロパティとみなされます 。
遅延格納プロパティ
レイジー保存プロパティーには、最初にアクセスされるまで計算されない値があります。これは、変数の計算が計算上高価な場合のメモリ節約に役立ちます。あなたは怠惰でプロパティを宣言lazy
:
lazy var veryExpensiveVariable = expensiveMethod()
多くの場合、クロージャの戻り値に割り当てられます。
lazy var veryExpensiveString = { () -> String in
var str = expensiveStrFetch()
str.expensiveManipulation(integer: arc4random_uniform(5))
return str
}()
遅延格納プロパティはvar
で宣言する必要があります。
計算されたプロパティ
格納されたプロパティとは異なり、 計算されたプロパティはゲッターとセッターで構築され、アクセスおよび設定時に必要なコードを実行します。計算されたプロパティは型を定義する必要があります:
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..."
読み取り専用の計算されたプロパティは、 var
:
var circumference: Double {
get {
return pi * radius * 2
}
}
読み取り専用の計算されたプロパティを短縮してget
を除外することができます:
var circumference: Double {
return pi * radius * 2
}
ローカル変数とグローバル変数
ローカル変数は、関数、メソッド、またはクロージャ内で定義されます。
func printSomething() {
let localString = "I'm local!"
print(localString)
}
func printSomethingAgain() {
print(localString) // error
}
グローバル変数は、関数、メソッド、またはクロージャーの外で定義され、型内で定義されていません(すべての角括弧の外で考える)。それらはどこでも使用できます:
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!
}
}
グローバル変数は遅延定義されています(「レイジープロパティ」の例を参照)。
タイプのプロパティ
型プロパティは、型自体のプロパティであり、インスタンス上のプロパティではありません。それらは、格納されたプロパティまたは計算されたプロパティの両方になります。型プロパティをstatic
宣言しstatic
:
struct Dog {
static var noise = "Bark!"
}
print(Dog.noise) // Prints "Bark!"
クラスでは、 static
代わりにclass
キーワードを使用して、オーバーライド可能にすることができます。ただし、これは計算されたプロパティに対してのみ適用できます。
class Animal {
class var noise: String {
return "Animal noise!"
}
}
class Pig: Animal {
override class var noise: String {
return "Oink oink!"
}
}
これはシングルトンパターンでよく使用されます 。
プロパティオブザーバ
プロパティオブザーバはプロパティの値の変更に応答します。
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
前に呼び出されmyProperty
設定されています。新しい値はnewValue
として使用でき、古い値はmyProperty
として引き続き使用できます。 -
didSet
は、myProperty
が設定された後にmyProperty
れます。古い値はoldValue
として使用でき、新しい値はmyProperty
として使用できるようにmyProperty
。
注意:
didSet
とwillSet
は、次の場合には呼び出されません。
- 初期値の割り当て
- それ自身で変数を変更することは
didSet
またはwillSet
-
didSet
とwillSet
oldValue
とnewValue
のパラメータ名は、読みやすくするために宣言することもできます。
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)")
}
}
注意: setterのパラメータ名を宣言することはサポートされていますが、名前を混在させないように注意する必要があります。
willSet(oldValue)
とdidSet(newValue)
は完全に合法ですが、コードの読者をかなり混乱させます。