打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Swift学习之路二(属性 Properties) | LvesLi's Blogging

Swift的属性可以分为三种:存储属性,计算属性(不适用于存储)和类属性(直接用于类型本身)。

一.存储属性,存储常量(let)或者变量(var)。

1.1 常量存储属性不可以更改,变量存储属性可以更改

struct Birthday{

let birthday:String

var age:Int

}

var myBirthday=Birthday(birthday: "1991-09-13", age: 23)

myBirthday.age=20

1.2 如果创建了一个结构体的实例并赋值给一个常量,则无法修改实例的任何属性,即使定义了变量存储属性:


let yourBirthday=Birthday(birthday: "1994-01-11", age: 20)

1.3 如果结构体实例是一个常量,则属性不可以更改.

原因:结构体是属性值类型,当其实例被声明为常量时,他的属性也相应成了常量。

而类则不同,类属于引用类型,把引用类型的实例复制给常量后,仍然可以修改实例的变量属性。

1.4延迟存储属性

延迟存储属性,是指第一次被调用的时候才会计算其初始值的属性。延迟属性以lazy开头表示,必须把延迟属性声明为变量


class MySize{
var w:Int=0
var h:Int=0
}
class LazyClass {

lazy var size=MySize()

var sex:String = ""

}

let myLazy=LazyClass()

myLazy.sex="boy" //这个时候age还没有初始化

myLazy.size.h //这个时候才实例化

2.计算属性

计算属性是为了设置其他属性的值,而不是为了存储用

struct Point{

var x=0.0

var y=0.0

}

struct Size {

var width=0.0

var height=0.0

}

struct Frame {

var origin=Point()

var size=Size()

//定义计算属性

var center:Point{

get {

let centX=origin.x+size.width/2

let centY=origin.y+size.height/2

return Point(x: centX, y: centY)

}

set(newCent){

origin.x=newCent.x-size.width/2

origin.y=newCent.y-size.height/2

}

}

}

var square=Frame(origin: Point(x: 10, y: 10), size: Size(width: 100, height: 100))

let squareCent=square.center //获得中心点

square.center=Point(x: 150, y: 150) //设置中心点

如果只有get,没有set则为只读计算属性

3.属性观察器

属性观察期,顾名思义,当属性变化时会调用,当属性相同时也会调用;

除延迟属性之外都可以定义属性观察器;

观察器,属性初始化时不会被调用

属性观察器有:

willSet :设置之前

didSet :设置之后


class Bird{

var year:String="2014"{

willSet{

if(newValue==year){

print("Same")

}else{

print("not same to \(year)\n")

}

}

didSet{

print("didset over\n");

}

}

}

var newBird=Bird()

newBird.year="2015"

/*

打印结果:

not same to 2014

didset over

*/

全局变量和局部变量注意点:

全局的常量或变量都是延迟计算的,跟延迟存储属性相似,不同的地方在于,全局的常量或变量不需要标记lazy特性。

局部范围的常量或变量不会延迟计算。

4.类型属性

类型属性和object-c中得静态变量差不多,当然语法有些不同。

1、)定义类型属性:使用关键字static来定义值类型(枚举和结构体)的类型属性,关键字class来为类(class)定义类型属性。

2.)类型属性必须设置初始值

3.)对于值类型(指结构体和枚举)可以定义存储型和计算型类型属性,对于类(class)则只能定义计算型类型属性。

struct Dog {

static var age=2

static var ageCal:Int{

return age

}

}

var agec=Dog.ageCal

class Cat {

//定义类的类型属性

class var age:Int{

return 3

}

}

var catAge=Cat.age

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Swift 属性
Swift之常量与变量
Swift基础数据类型
苹果Swift语言入门教程【中文版】
Swift(一)
专栏:Swift轻松入门
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服