文档章节

Swift -- 属性

上官尘
 上官尘
发布于 2016/03/02 22:52
字数 1343
阅读 29
收藏 0
点赞 1
评论 0

一:存储属性  //一个存储属性就是存储在特定类或结构体的实例里的一个常量或变量

(1)存储属性

/*
结构体和类常量与存储属性的关系
结构体和枚举是值类型
类是引用类型
*/
struct hhh {
    var name:String?
    var age:Int = 99
    let xxx:int = 12//在外面不能修改
}
var he = hhh(name: "nihao", age: 11)
he.name = "niha"
he.age = 112
//因为结构体是值类型, 所以不能修改结构体常量中的属性
let he = hhh(name: "nihao", age: 11)
//类
class Person4 {
    var name: String = "lnj"
    var age: Int = 30
}
let p4:Person4 = Person4()
// 可以修改类常量中的值, 因为他指向的对象不是一个常量
p4.name = "hm"
// 不可以修改类常量的指向
//p4 = Person4()

(2)延迟存储属性

/*
延迟存储属性
Swift语言中所有的存储属性必须有初始值, 也就是当构造完一个对象后, 对象中所有的存储属性必须有初始值, 但是也有例外, 其中延迟存储属性可以将属性的初始化推迟到该属性第一次被调用的时候
懒加载应用场景:
    1.有可能不会用到
    2.依赖于其它值
*/

class Line {
    var start:Double = 0.0
    var end: Double = 0.0
    // 如果不是lazy属性, 定义的时候对象还没有初始化, 所以不能访问self
    // 如果加上lazy, 代表使用时才会加载, 也就是使用到length属性时才会调用self,
    // 而访问一个类的属性必须通过对象方法, 所以访问时对象已经初始化完成了, 可以使用self
    lazy var length: Double = self.getLenght()
    // 通过闭包懒加载
    lazy var container: Array<AnyObject> = {
        print("懒加载")
//        return self.end - self.start
        var arrM = []
        return arrM as [AnyObject]
    }()
    func getLenght() ->Double
    {
        print("懒加载")
        return end - start
    }
}
var line = Line()
line.end = 150.0
//print(line.getLenght())
print("创建对象完毕")
print(line.length)
var arrM = line.container
arrM.append("1")
arrM.append(5)
print(arrM)

二:计算属性

(1)计算属性

/*
计算属性
1.Swift中的计算属性不直接存储值, 跟存储属性不同, 没有任何的"后端存储与之对应"
2.计算属性用于计算, 可以实现setter和getter这两种计算方法
3.枚举不可以有存储属性, 但是允许有计算属性
setter 对象.属性 = 值
getter var value = 对象.属性
*/

struct Rect {
    var origion: (x: Double, y: Double) = (0, 0)
    var size: (w: Double, h: Double) = (0, 0)
    // 由于center的值是通过起点和宽高计算出来的, 所以没有必要提供一个存储属性
//    var center: (x: Double, y: Double) = (0, 0)
    var center: (x: Double, y: Double) {
        get{
//            print("get")
           return (origion.x + size.w/2, origion.y + size.h/2)
        }
//        set(newCenter){
        set{
//            print("set \(newCenter)")
            // 注意: 计算属性不具备存储功能, 所以不能给计算属性赋值, 如果赋值会发生运行时错误
            // 注意: setter可以自己传递一个参数, 也可以使用系统默认的参数newValue
            // 如果要使用系统自带的参数, 必须删除自定义参数
//            origion.x = newCenter.x - size.w / 2
//            origion.y = newCenter.y - size.h / 2
            origion.x = newValue.x - size.w / 2
            origion.y = newValue.y - size.h / 2
        }
    }
}
var r = Rect()
r.origion = (0, 0)
r.size = (100, 100)
//r.center = ((r.origion.x + r.size.w) / 2, (r.origion.y + r.size.h) / 2)
print("center.x = \(r.center.x) center.y = \(r.center.y)")
r.center = (100, 100)
print("origion.x = \(r.origion.x) origion.y = \(r.origion.y)")
print("center.x = \(r.center.x) center.y = \(r.center.y)")

(2)只读计算属性

/*
只读计算属性
对应OC中的readonly属性, 所谓的只读属性就是只提供了getter方法, 没有提供setter方法
*/

class Line2 {
    var start:Double = 0.0
    var end: Double = 0.0
    // 只读属性, 只读属性必须是变量var, 不能是常量let
    // 例如想获取长度, 只能通过计算获得, 而不需要外界设置, 可以设置为只读计算属性
    var length: Double{
        // 只读属性的简写, 可以省略get{}
//        get{
            return end - start
//        }
    }
}

var line2 = Line2()
line2.end = 100
print(line2.length)

三:属性观察器

/*
属性观察器,类似OC中的KVO, 可以用于监听属性什么时候被修改, 只有属性被修改才会调用
有两种属性观察器:
1.willSet, 在设置新值之前调用
2.didSet, 在设置新值之后调用
可以直接为除计算属性和lazy属性之外的存储属性添加属性观察器, 但是可以在继承类中为父类的计算属性提供属性观察器
因为在计算属性中也可以监听到属性的改变, 所以给计算属性添加属性观察器没有任何意义
*/
class Line3 {
    var start:Double = 0.0{
        willSet{
            print("willSet newValue = \(newValue)")
        }
        didSet{
            print("didSet oldValue = \(oldValue)")
        }
    }
    var end: Double = 0.0
}
var l = Line3()
l.start = 10.0

四:类属性

/*
类属性
在结构体和枚举中用static
在类中使用class, 并且类中不允许将存储属性设置为类属性
*/

struct Person5 {
    // 普通的属性是每个对象一份
    var name: String = "lnj"
    // 类属性是素有对象共用一份
    static var gender:String = "man"
    static var age:Int{
        return 30
    }
    func show()
    {
        print("gender = \(Person5.gender) name = \(name)")
    }
}
var p5 = Person5()
//print("gender = \(p.gender)")
print("gender = \(Person5.gender)")
var p6 = Person5()
// 类属性是所有对象共用一份
print("gender = \(Person5.gender)")
p5.show()
// 可以将计算属性设置为类属性
print("age = \(Person5.age)")



class Person6 {
    // 普通的属性是每个对象一份
    var name: String = "lnj"
    // 类中不允许将存储属性定义为类属性
//    class var gender:String = "man"
    // 类中只能将计算属性定义为类属性
    class var age:Int{
        return 30
    }
    func show()
    {
        print("age = \(Person6.age)")
    }
}
var p7 = Person6()
print("age = \(Person6.age)")
p7.show()


© 著作权归作者所有

共有 人打赏支持
上官尘
粉丝 6
博文 38
码字总数 9881
作品 0
普陀
程序员
Swift4.0基础知识回顾

简单介绍一下Swift Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序,Swift语言让应用开发更简单、更快、更稳定,确保最终应用有着更好的质量更多了解Swift可以去《The...

博行天下 ⋅ 2017/12/06 ⋅ 0

Swift中KVO(监听)的使用方法及注意事项

1,在写swift的KVO的过程中,其不能监听基本数据类型的属性,若想监听需将其改成NSNumber类型,或其它类型,否则监听的代理方法不走。 2,在写swift的KVO的过程中,被监听的属性必须用“dyn...

SimonXun ⋅ 2016/05/20 ⋅ 0

swift的静态属性(方法)和java的不同

swift在任何情况下静态属性都要加上类名做为前缀, 在java中通过实例名使用静态属性是一个warning, 在swift中这里是一个错误 swift中的static属性(默认就是final) === swift中的final class =...

cyper ⋅ 2016/05/28 ⋅ 0

swift中KVO和属性观察器

开篇提醒:OC中的KVO及其KVO的基础知识可参见:深入runtime探究KVO Swift中,原本没有KVO模式,为何这么说,请看下文: KVO本质上是基于的动态分发机制,通过来监听的值。 OC能够实现监听因为...

CoderDancer ⋅ 2017/01/13 ⋅ 0

Swift中类的使用

Swift中类的使用 主要内容 类的介绍和定义 类的属性 类的构造函数 一. 类的介绍和定义 Swift也是一门面向对象开发的语言 面向对象的基础是类,类产生了对象 在Swift中如何定义类呢? class是S...

别情花如依丶 ⋅ 2016/12/22 ⋅ 0

《Using Swift with Cocoa and Objective-C》总结

互用性 1>与Objective-C API交互 1.初始化 1)在OC中,初始化往往会有init、initWith字眼,但在swif却在这里都省略了,连分配内存的alloc,swift也会自动帮我们处理。 //Objective-CUITableVi...

Ethan-GOGO ⋅ 2015/10/29 ⋅ 0

细说 Swift 4.2 新特性:Dynamic Member Lookup

Swift 4.2 的新特性这两篇文章已经介绍的很清楚了:WWDC 2018:Swift 更新了什么,Swift 4.2 新特性更新。但是 4.2 中实现的 dynamic member lookup 苹果在 WWDC 上却完全没有提到。然而我认...

没故事的卓同学 ⋅ 06/16 ⋅ 0

swift中修饰词,fileprivate、private、internal、public 、open 及lazy的使用

在swift开发语言中,访问修饰符就fileprivate、private、internal、public 、open这五种。其中fileprivate和open是swift3中添加的;由于之前的swift对于访问控制是基于文件的,在swift3中就出...

媛美一生 ⋅ 2016/09/29 ⋅ 0

Swift和Javascript的神奇魔法

前言 今天在网上看到了一篇介绍Swift和Javascript交互的文章,感觉作者写的很好,因此把作者文章中的主要知识点进行一个总结。 对于我个人而言,在项目中使用Javascript的原因有两个: 某些任...

llljj96 ⋅ 2017/05/23 ⋅ 0

Swift中的可选类型(Optional)

Swift中的可选类型(Optional) 什么是Optional Optional在Swift中表示可选类型,那么什么是可选类型? 我们都知道,在Swift中,属性的值都是不能为的,但是在正常情况下你不可能一开始就确定...

Yenn ⋅ 2015/08/28 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

一起读书《深入浅出nodejs》-node模块机制

node 模块机制 前言 说到node,就不免得提到JavaScript。JavaScript自诞生以来,经历了工具类库、组件库、前端框架、前端应用的变迁。通过无数开发人员的努力,JavaScript不断被类聚和抽象,...

小草先森 ⋅ 昨天 ⋅ 0

Java桌球小游戏

其实算不上一个游戏,就是两张图片,不停的重画,改变ball图片的位置。一个左右直线碰撞的,一个有角度碰撞的。 左右直线碰撞 package com.bjsxt.test;import javax.swing.*;import j...

森林之下 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部