(十九) [Swift]你了解Swift中的属性吗?

2016-08-15  本文已影响22人  修行猿

1.存储类型的属性的初始化

struct YXRect {
    var origin:CGPoint
    var width:CGFloat
    var height:CGFloat
}
//错误
//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
      }
}
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
      }
  }
//正确
class YXRect {
    var origin:CGPoint?
    var width:CGFloat
    var height:CGFloat
    init(width:CGFloat,height:CGFloat){
        self.width = width
        self.height = height
    }
}
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一样在一个类中声明一个静态变量
而OC必须借助类方法才能达到这样的效果

class Person {
    static var type = "地球人"
}
//这样就可以直接访问
Person.type   //地球人
@interface Person : NSObject
 +(NSString *)type;
@end
@implementation Person
static NSString *type = @"地球人";
+(NSString *)type{
    return type;
}
@end
[Person type];

可见相比较而言还是Swift语法,更加简练一些。

上一篇 下一篇

猜你喜欢

热点阅读