サーチ…


備考

プロパティ :型に関連付けられています

変数 :型に関連付けられていません

詳細については、 Swift Programming LanguageのiBookを参照してください。

変数の作成

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コードポイント、または線と箱の描画文字を含めることはできません。彼らは数字で始めることもできません

ソース developer.apple.com

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

注意: didSetwillSetは、次の場合には呼び出されません。

  • 初期値の割り当て
  • それ自身で変数を変更することはdidSetまたはwillSet
  • didSetwillSet oldValuenewValueのパラメータ名は、読みやすくするために宣言することもできます。
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)は完全に合法ですが、コードの読者をかなり混乱させます。


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow