美文网首页
(十九) [Swift]你了解Swift中的属性吗?

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

作者: 修行猿 | 来源:发表于2016-08-15 08:06 被阅读22次

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一样在一个类中声明一个静态变量
而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语法,更加简练一些。

相关文章

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

    1.存储类型的属性的初始化 存储类型 存储类型的属性的初始化,存储类型的属性,在结构体或者对象创建的时候必须保证初...

  • Swift 属性

    Swift 属性 在Swift中属性主要分为存储属性、计算属性、延迟存储属性、类型属性这四种,并且Swift还提供...

  • Swift中的属性修饰符(复习)

    在Swift中没有.h、.m,只有一个.swift文件。而且在Swift中声明属性也大不相同。这个需要我们先了解S...

  • OC的@property与Swift的存储属性/计算属性类比

    Swift中的计算属性/存储属性与OC中的@property   Swift中引入了存储属性、计算属性的概念,存储...

  • 浅谈 Swift 中的属性(Property)

    Properties in Swift 前言 Swift 中的属性分为存储属性与计算属性,存储属性即为我们平时常用...

  • Swift进阶(三)--- 属性

    Swift的属性 在swift中,属性主要分为以下几种: 存储属性 计算属性 延迟存储属性 类型属性 一:存储属性...

  • Swift学习-进阶02

    swift对象本质,一个swift的对象默认占用16字节大小,在内存中的结构: swift类结构: 属性 存储属性...

  • swift-类属性

    了解属性之前,需要先了解前面的swift-类结构内容 - swift-类结构源码探寻[https://www.ji...

  • Swift笔记(一)属性、析构、调用OC单例

    目录 swift属性存储属性懒加载属性计算属性属性监听类型属性 swift析构函数 swift调用OC单例类方法 ...

  • Swift属性使用

    Swift属性使用 一在uitableviewcell中使用情况 (OC中属性与swift使用的区别,get、se...

网友评论

      本文标题:(十九) [Swift]你了解Swift中的属性吗?

      本文链接:https://www.haomeiwen.com/subject/ehhusttx.html