(19)[Swift]Swiftの属性を知っていますか?

4433 ワード

1.記憶タイプの属性の初期化
  • ストレージタイプ
  • struct YXRect {
        var origin:CGPoint
        var width:CGFloat
        var height:CGFloat
    }
    
  • 記憶タイプの属性の初期化、記憶タイプの属性は、構造体またはオブジェクトの作成時に
  • の初期化を一度保証する必要がある.
  • は初期化方法で初期化され、宣言時に初期化されない場合、init関数に必要な
  • である.
    // 
    //class YXRect {
    //    var origin:CGPoint
    //    var width:CGFloat
    //    var height:CGFloat
    //    init(width:CGFloat,height:CGFloat){
    //        self.width = width
    //        self.height = height
    //    }
    //}
    class YXRect {
          var origin:CGPoint
          var width:CGFloat
          var height:CGFloat
          init(origin:CGPoint,width:CGFloat,height:CGFloat){
              self.origin = origin
              self.width = width
              self.height = height
          }
    }
    
  • は直接宣言する時に初期化して、宣言する時に初期化することがあって、init関数の中で必要ではありません
  • class YXRect {
          var origin:CGPoint = CGPoint(x:1,y:1)
          var width:CGFloat
          var height:CGFloat
          init(width:CGFloat,height:CGFloat){
              self.width = width
              self.height = height
          }
      }
    
  • optional属性非強制初期化
  • // 
    class YXRect {
        var origin:CGPoint?
        var width:CGFloat
        var height:CGFloat
        init(width:CGFloat,height:CGFloat){
            self.width = width
            self.height = height
        }
    }
    
  • structはデフォルトですべての属性のinit関数を提供しますが、classは
  • ではありません.
    struct YXRect {
        var origin:CGPoint
        var width:CGFloat
        var height:CGFloat
    }
    // 
    //class YXRect4 {
    //    var origin:CGPoint
    //    var width:CGFloat
    //    var height:CGFloat
    //
    //}
    class YXRect{
        var origin:CGPoint
        var width:CGFloat
        var height:CGFloat
        init(origin:CGPoint,width:CGFloat,height:CGFloat){
            self.origin = origin
            self.width = width
            self.height = height
        }
    }
    

    2.ストレージタイプ属性のリスニング
    struct YXRect {
        var origin:CGPoint
        var width:CGFloat{
            willSet(newValue){
                print("will set \(newValue)")
            }
            didSet(newValue){
                print("did set \(newValue)")
                if(newValue>200){
                    width = 200
                }
            }
        }
        var height:CGFloat
        init(origin:CGPoint,width:CGFloat,height:CGFloat){
            self.origin = origin
            self.width = width
            self.height = height
        }
    }
    

    3.計算タイプの属性
  • 計算属性の取得
  • struct YXRect {
        var origin:CGPoint
        var width:CGFloat
        var height:CGFloat
        
        init(origin:CGPoint,width:CGFloat,height:CGFloat){
            self.origin = origin
            self.width = width
            self.height = height
            
        }
        // get 
        var center : CGPoint  {
            print(" center")
            let x = self.origin.x + self.width*0.5
            let y = self.origin.y + self.height * 0.5
            return CGPoint(x:x,y:y)
        }
    }
    
  • 計算属性の設定
  • struct YXRect {
        var origin:CGPoint
        var width:CGFloat
        var height:CGFloat
        
        init(origin:CGPoint,width:CGFloat,height:CGFloat){
            self.origin = origin
            self.width = width
            self.height = height
            
        }
        // , get   set 
        var center : CGPoint  {
            get{
                print(" center2")
                let x = self.origin.x + self.width*0.5
                let y = self.origin.y + self.height * 0.5
                return CGPoint(x:x,y:y)
            }
            set(newValue){
                print(" center2")
                self.origin.x = newValue.x - self.width * 0.5
                self.origin.y = newValue.y - self.height * 0.5
            }   
        }
    }
    

    4.リロード属性
    class Account{
        var name : String
        // self , self , unowned
        lazy var hellow :String = {[unowned self] in
            print(" ")
            return "hellow \(self.name)"
            }()
        init(name:String){
            self.name = name
        }
    }
    
    var accout = Account(name:"aaa")
    accout.hellow
    accout.hellow
    accout.hellow
    //" " 
    

    5.クラスの静的属性
    Swiftではjavaのように1つのクラスで静的変数を宣言できますが、OCはクラスメソッドを使用してこのような効果を達成する必要があります.
  • Swift
  • class Person {
        static var type = " "
    }
    // 
    Person.type   // 
    
  • OC
  • @interface Person : NSObject
     +(NSString *)type;
    @end
    @implementation Person
    static NSString *type = @" ";
    +(NSString *)type{
        return type;
    }
    @end
    [Person type];
    

    比較するとやはりSwift文法で、もっと簡潔になっていることがわかります.