13-Swiftのクラス

7144 ワード

一、クラスの紹介と定義

  • Swiftもオブジェクト向けに開発された言語であり、オブジェクト向けの基礎はクラスであり、クラスはオブジェクトを生み出した.
  • Swiftでクラスを定義する:classキーワードでクラスを定義する
  • .
    class  :SuperClass{
        // 
    }
    
  • 注意:
  • クラスを定義する場合、親クラスがなくてもよい.このクラスがルートクラスである.OCには、親
  • が必要です.
  • 通常、クラスを定義するときにNSObjectから継承されます.

  • 二、クラスを定義する際の注意事項:

  • クラスは、「オプションではない」メンバー属性に値が必要であることを保証するために、構造体のように自動的に「逐一コンストラクタ」を生成しません.
  • ソリューション:
  • 「オプションでない」属性をオプション属性に変更します.
  • 「オプション以外」属性にデフォルト値を設定します.
  • は、コンストラクション関数で「オプションでない」属性に値を割り当てます.
  • class Person{
          var add:String?
          var age:Int = 0
          var name:String
    
          init() {
            name = "yijiang"
          }
    }
    let p = Person()
    

    三、クラスの構造関数

  • 構造関数の紹介:
  • 構造関数はOCの初期化方法に似ている:init方法;
  • デフォルトでは、クラスを作成するときにコンストラクション関数が呼び出される必要があります.
  • コンストラクタは、コンストラクタを記述していない場合でも、デフォルトのコンストラクタを提供します.
  • NSObjectから継承されている場合は、親のコンストラクション関数を書き換えることができます.
  • class Student:NSObject{
          var name:String
          var age:Int
          // 
          // , “ ” 
          init(name:String,age:Int) {
            self.name = name
            self.age = age
          }
          // 
          override init() {
            name = "jiang"
            age = 0
          }
    }
    let s1 = Student(name: "yijiang", age: 18)
    s1.name  //yijiang
    let s2 = Student()
    s2.name   //jiang
    
  • 構造関数の使用:
  • 基本使用:クラスの「オプションでない」属性には値が必要です.定義時に値を初期化しない場合は、コンストラクション関数に値を割り当てることができます.
  • 初期化時に属性に値を付与:多くの場合、オブジェクトを作成するときに属性に値を付与します.コンストラクション関数をカスタマイズできます.注:コンストラクション関数をカスタマイズするとinitメソッドが上書きされます.

  • 四、クラスの構造関数

  • 解析関数:
  • Swiftは、リソースを解放するために不要なインスタンスを自動的に解放します.
  • 解析関数の書き方
  • class YJWView:UIViewController{
         // 
         var name:String?
         var age:Int?
    
         // 
         deinit {
           print(" ")
         }
    }
    // 
    extension YJWView{
         override func viewDidLoad() {
    
         }
    }
    // 
    extension YJWView{
         func data() {
    
         }
    }
    var p:YJWView? = YJWView()
    p = nil     // “ ”
    

    五、クラスの属性

  • Swiftのクラスの属性は多種あります:
  • ストレージ属性:インスタンスの定数と変数を格納します.
  • 計算属性:何らかの方法で計算された属性;
  • クラス属性:クラス全体に関連する属性.
  • ストレージ属性:
  • ストレージ属性は最も簡単な属性であり、クラスインスタンスの一部として定数と変数を格納するために使用される.
  • は、記憶属性にデフォルト値を提供してもよいし、初期化方法で初期化してもよい.
  • 計算プロパティ:
  • 計算プロパティは、実際の値を格納するのではなく、getterとオプションのsetterを提供して、他の値を間接的に取得し、設定します.
  • 計算属性は一般的にgetterメソッドのみを提供する.
  • getterメソッドのみがsetterを提供しない場合、この計算プロパティは読み取り専用プロパティであり、get()を省略することができる.
  • クラス属性:
  • クラス属性は、クラスのインスタンスに関連付けられるのではなく、クラスに関連付けられる.
  • すべてのクラスとインスタンスにはクラス属性が共有されているため、ある場所で変更すると、そのクラス属性が変更されます.
  • クラス属性の設定と変更はクラスによって行う必要があります.
  • class Person:NSObject{
        // : 
        var name:String = ""
        var age:Int = 0
        var score1:Double = 50
        var score2:Double = 70
        // , setter/getter , getter , setter , 
    
        // : 
        var score3:Double{
            get{
                return (score1 + score2) / 2
            }
            set{
                newValue
                // 
            }
        }
    
        // : 
        static var personCount:Int = 0
    
        override init() {
            Person.personCount += 1
        }
        deinit {
            Person.personCount -= 1
        }
    }
    
    let p = Person()
    p.score3 = 20   // newValue 20
    p.score3    //60
    let p2 = Person()
    var p3:Person? = Person()
    Person.personCount  //3
    p3 = nil
    Person.personCount  //2
    

    六、傍受属性の変更

  • OCではsetメソッドを書き換えて属性の変更を傍受することができます.
  • Swiftでは、属性観察者によって属性値の変更を傍受し、応答することができる.
  • は、通常、ストレージ属性とクラス属性の変更をリスニングする(計算属性については、計算属性のsetterでこの値の変化を直接観察し、応答できるため、属性観察者を定義する必要はありません).
  • 観察方法を設定することによって観察者を定義する:
  • willSet:属性値が格納される前に設定され、新しい属性値が定数パラメータとして入力されます.このパラメータ名はデフォルトでnewValueです.
  • didSet:新しい属性値が格納された直後に呼び出され、willSetと同様に、このとき入力されるのは属性の古い値であり、デフォルトのパラメータ名はoldValueである.
  • willSetおよびdidSetは、プロパティが設定されている場合にのみ呼び出され、初期化時にこれらのリスニングメソッドは呼び出されません.
  • class Person{
        // willSet/didSet
        var name:String? = "yijiangwnag"{
            willSet{
                newValue
                print(name ?? "")
                print("---------")
            }
            didSet{
                oldValue
                print(name ?? "")
            }
        }
    }
    
    let p = Person()
    p.name = "jiang"
    p.name = "yijiang"
    
    /*
     :
    yijiangwnag
    ---------
    jiang
    jiang
    ---------
    yijiang
    */
    

    七、類の方法

  • キーワードstaticによるクラスメソッドの定義:
  • class Person{
        // 
        func introduce(name:String,age:Int) {
            print(" ",name,age)
        }
        // 
        static func intro(name:String){
            print(" ",name)
        }
    }
    let p = Person()
    // 
    p.introduce(name: "yijiang", age: 18)
    // 
    Person.intro(name: "wang")
    /*
     :
      yijiang 18
      wang
    */
    

    八、三大特性

  • の3つの特性:パッケージ、継承、マルチステート.
  • パッケージ;
  • 継承:
  • 書き換え方法:一般的な親の方法で必要な機能が実現できない場合、親の方法
  • を書き換える.
    class Person{
          func eat() {
            print(" ")
          }
    }
    class Man:Person{
          // eat 
          override func eat() {
            print(" ")
          }
    }
    let p = Man()
    p.eat()
    // 
    
  • リロード方法:パラメータ名が同じで、パラメータタイプが異なり、パラメータ個数が異なる
  • class Num{
          func read(num:Int) {
            print(" ")
          }
    }
    class NumE:Num{
          func read(num: Float) {
            print(" ")
          }
          func read(num: Int,num2:Int) {
            print(" ")
          }
    }
    let num = NumE()
    num.read(num: 12)   // 
    num.read(num: 12.0) // 
    num.read(num: 1, num2: 2)   // 
    
  • マルチステート:親のポインタで子
  • を指す
    class Printer{
        func printer(){
            print(" ")
        }
    }
    class ColorPrinter:Printer{
        override func printer() {
            print(" ")
        }
    }
    class BlackPrinter:Printer{
        override func printer() {
            print(" ")
        }
    }
    func work(printer:Printer){
        // printer Printer 
        printer.printer()
    }
    let p = Printer()
    let colorP = ColorPrinter()
    let blackP = BlackPrinter()
    work(printer: blackP)   // 
    

    九、類と構造体の違い

  • 構造体には、自動的に生成される初期化器(逐一コンストラクタ)があり、新しいインスタンスの各属性の初期値は、属性の名前によってメンバー逐一初期化器に渡すことができる.クラスはありません.解決方法:属性をオプションのタイプに変更します.または属性を初期化します.またはinit()に値を割り当てます.
  • struct PersonS{
        var name:String
        func run() {
            print(" ")
        }
    }
    class PersonC{
        var name:String
        func run() {
            print(" ")
        }
    
        init() {
            name = "zhangsan"
        }
    }
    
  • 構造体は値タイプであり、クラスは参照タイプである.構造体の付与は、コピー動作の発生を意味する.
  • // 
    struct PersonS{
        var name:String
        func run() {
            print(" ")
        }
    }
    // 
    class PersonC{
        var name:String
        func run() {
            print(" ")
        }
    
        init() {
            name = "zhangsan"
        }
    }
    // 
    let ps = PersonS(name: "zhangsan")
    ps.name //zhangsan
    ps.run()    // 
    var pss = ps
    pss.name = "yijiang"
    ps.name //zhangsan
    // 
    let pc = PersonC()
    pc.name //zhangsan
    pc.run()    // 
    let pcc = pc
    pcc.name = "yijiang"
    pc.name //yijiang
    
  • 構造体は継承できません(マルチステートがないことを意味します).