swift - 类和结构体(之属性)

swift - 类和结构体(之属性),第1张

概述值类型和引用类型中可以通过外部访问的成员(除了方法外)都叫做属性。 swift中到底存在多少种属性? 1.存储属性 类和结构体的成员变量或者成员常量都属于存储属性。 struct FixedLengthRange{ var firstValue:Int  let length: Int } //创建结构体对象,并初始化结构体中属性 var rangeOfThreeItems = FixedLeng

值类型和引用类型中可以通过外部访问的成员(除了方法外)都叫做属性。

swift中到底存在多少种属性?

1.存储属性

类和结构体的成员变量或者成员常量都属于存储属性。

struct FixedLengthRange{

var firstValue:Int

let length: Int

}

//创建结构体对象,并初始化结构体中属性

var rangeOfThreeItems = FixedLengthRange(firstValue:0,length:3)

rangeOfThreeItems.firstValue = 6

println(rangeOfThreeItems.firstValue)


let rangeOfThreeItems = FixedLengthRange(firstValue:0,length:3)

rangeOfThreeItems.firstValue = 6//this is wrong.

class NewProduct{

var name:String = ""

var price:float = 120

var newProduct = NewProduct()

println(newProduct.name)


注意:所有值类型的常量,其内部所有的成员也同样不可修改。例如,前面代码中如果将var rangeOfThreeItems 写成 let rangeOfThreeItems,即使FixedLengthRange中有变量,也不可以修改变量值。


2.惰性存储属性

只有在第一次访问该属性时才进行初始化。主要是在处理非常消耗资源的初始化工作时非常拥有,只有需要消耗这些资源时才消耗。

class Dataimporter{

var filename= “data.txt”

fun process() -> String{

println("process")

//本来这里应该读取data.txt文件

return "data.txt"

}

class DataManager{

lazy var importer = Dataimporter().process()//懒属性,只有在第一次使用此属性时才被初始化。

var data = [String]()

let manager = DataManager()

manager.data += "Some data"

manager.data += "Some more data"

println(manager.data)

//现在Dataimporter.process 方法还没有被调用

println(DataManager().importer)//此处用到DataManager().importer,实行了懒属性的懒加载


输出如下内容:

1. [Some data,Some more data]

2. process

3. data.txt


而如果去掉lazy,输出如下内容:

1. process

2. [Some data,Some more data]

3. 4. data.txt


3.可读写的计算属性 (get 、set)

struct Point{

var x = 0.0,y = 0.0

struct Size{

var wIDth = 0.0,height = 0.0

struct Rect{

var origin = Point()

var size = Size()

//Point 是center属性的数据类型,必须指定

var center:Point{

get {

let centerX = origin.x + (size.wIDth /2)

let centerY = origin.y + (size.height /2)

return Point(x:centerX,y : centerY)

}

set(myCenter){

origin.x = myCenter.x - (size.wIDth /2 )

origin.y = myCenter.y - (size.height / 2)

}

}


4.只读计算属性

如果将计算属性中的set去掉,则该属性为只读计算属性,只能获取该属性的值,不能设置属性的值。(不可加get、set关键字,否则不为只读属性)

struct CuboID{

var volume:Double{

return wIDth * height * depth

}


5.属性观察器

当设置属性相关。当设置属性之前,会调用willSet观察器,并将新设置的属性值传入willSet观察器。设置完属性后,又会调用dIDSet观察器,并将就该属性旧的值传入dIDSet观察器。

class StepCounter{

var totalSteps: Int = 0

{

willSet(newTotalSteps){

print("New value is \(newTotalSteps)")

}

dIDSet(myoldValue){

print("old value is \(myoldValue)")

}

}

}

let stepCounter = StepCounter()

stepCounter.totalSteps = 200

stepCounter.totalSteps = 360

stepCounter.totalSteps = 896

New value is 200

old value is 0

New value is 360

old value is 200

New value is 896

old value is 360


如果不在willSet 和dIDSet 后面的圆括号中指定参数名,则willSet 中默认的参数名是newValue,dIDSet中默认的参数名是oldValue。


class StepCounter{

var totalSteps: Int = 0 {

willSet{

print("New value is \(newValue)")

}

dIDSet{

print("old value is \(oldValue)")

}

}


注意:willSet 和 dIDSet 不能和 set、get 一起使用,这一点使用时要注意。


全局变量也可以使用:

var totalSteps: Int = 0{

willSet(newTotalSteps){

print("New value is \(newTotalSteps)")

}

dIDSet(myoldValue){

print("old value is \(myoldValue)")

}

}

totalSteps = 123

var origin = Point(x:200,y:200)

var size = Size()

//全局计算变量

var center:Point{

get{

let centerX = origin.x +(size.wIDth /2)

let centerY = origin.y + (size.height / 2)

return Point(x:centerX,y : centerY)

}

set(myCenter){

origin.x = myCenter.x-(size.wIDth/2)

origin.y = myCenter.y-(size.height/2)

}

}

print("x=\(center.x),y=\(center.y)")

输出内容如下:

New value is 123

old value is 0

x=200.0,y=200.0


5.静态属性

静态计算属性不需要创建对象,可以直接从类、结构体和枚举类型中引用。用该类型创建的对象共享一个表态属性。结构体和杖举类型使用static声明表态属性,而类需要使用class声明表态属性。

struct MyStructure{

//静态计算属性

static var computedTypeProperty:String{

return "Hello world"

}

static var typeProperty:Int = 20

}


enum MyEnumeration{

static var storedTypeProperty = "Some value."

//静态计算属性

static var computedTypeProperty:Int{

get{

return 200

}

}

}


class MyClass{

//静态计算属性

class var computedTypeProperty:Int{

return 123

}

}

}


class MyClass{

//静态计算属性

class var computedTypeProperty:Int{

return 123

}

}

print(MyClass.computedTypeProperty)

print(MyEnumeration.computedTypeProperty)

print(MyStructure.typeProperty)

结果:

123

200

20

总结

以上是内存溢出为你收集整理的swift - 类和结构体(之属性)全部内容,希望文章能够帮你解决swift - 类和结构体(之属性)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1077130.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)