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

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 - 类和结构体之属性的更多相关文章

  1. canvas中普通动效与粒子动效的实现代码示例

    canvas用于在网页上绘制图像、动画,可以将其理解为画布,在这个画布上构建想要的效果。本文详细的介绍了粒子特效,和普通动效进行对比,非常具有实用价值,需要的朋友可以参考下

  2. H5混合开发app如何升级的方法

    本篇文章主要介绍了H5混合开发app如何升级的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  3. canvas学习和滤镜实现代码

    这篇文章主要介绍了canvas学习和滤镜实现代码,利用 canvas,前端人员可以很轻松地、进行图像处理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  4. localStorage的过期时间设置的方法详解

    这篇文章主要介绍了localStorage的过期时间设置的方法详解的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  5. 详解HTML5 data-* 自定义属性

    这篇文章主要介绍了详解HTML5 data-* 自定义属性的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  6. HTML5的postMessage的使用手册

    HTML5提出了一个新的用来跨域传值的方法,即postMessage,这篇文章主要介绍了HTML5的postMessage的使用手册的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  7. HTML5 3D书本翻页动画的实现示例

    这是一款十分炫酷的HTML5 3D书本翻页动画,效果相对比较简单,拖拽鼠标模拟用手翻页,需要的朋友们下面随着小编来一起学习学习吧

  8. 教你使用Canvas处理图片的方法

    本篇文章主要介绍了教你使用Canvas处理图片的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  9. 使用postMessage让 iframe自适应高度的方法示例

    这篇文章主要介绍了使用postMessage让 iframe自适应高度的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  10. ios – UIPopoverController出现在错误的位置

    所以我花了一些时间寻找答案,但到目前为止还没有找到任何答案.我正在尝试从UIInputAccessoryView上的按钮呈现弹出窗口.UIBarButtonItem我想显示popover来自定制视图,所以我可以使用图像.我创建这样的按钮:当需要显示popover时,我这样做:但我得到的是:弹出窗口看起来很好,但它应该出现在第一个按钮上时出现在第二个按钮上.然后我发现了这个问题:UIBarButto

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部