swift 属性
属性将值和类,结构,枚举相关联。属性分为计算属性和存储属性。存储属性存储常量或变量作为实例的一部分 ,计算属性计算一个值。存储属性用于类和结构体,计算属性用于类,结构体和枚举。
1:存储属性
存储属性是存储类或结构体的实例里的一个常量或变量。
struct Range{
var length:Int
let height:Int
}
var testRang = Range(length:, height:)
testRang.length =
2:常量和存储属性
如果将结构体的实例定义为一个常量,则不能修改实例的任何属性。
struct Range{
var length:Int
let height:Int
}
let testRang = Range(length:, height:)
//testRang.length = 3 error
其原因在于结构体(struct)是值类型,其实例被定义成常量后它结构体的所有属性都是常量类型。
但如果是class类类型,定义成常量后,实例的变量类型依然可以被修改。类是引用类型。
3:延迟存储属性。@lazy表示一个变量(只能是变量var)声明为延迟存储属性,这样在实例创建时候变量不会创建,只有引用到该变量时候才会创建
class BigConstructor{
var strMsg = "big msg"
}
class CLazyVar{
@lazy var lazyVar = BigConstructor()
var strName = "tset"
}
import Foundation
var obj = CLazyVar();
obj.strName = "sx"//lazyVar还没被创建
println("\(obj.strName) \(obj.lazyVar)")//这时候才创建
4:属性和实例变量
swift语言没有使用变量来做存储,统一使用属性访问。
5: 计算属性。计算属性提供一个get/set来 获取/改变 其他属性的值
class CValue{
var strName:String = "xx"
var value:String{
get{
return strName
}
set(newStrName){
strName += newStrName
}
}
}
import Foundation
var obj = CValue()
obj.value = " oid"
println("\(obj.strName)")
5.1 便捷set属性,可以使用默认的名字newValue写set属性而不用带括号
class CValue{
var strName:String = "xx"
var value:String{
get{
return strName
}
set{
strName += newValue
}
}
}
5.2只读计算属性。可以只通过get而不用set返回一个只读计算属性。
class CValue{
var strName:String = "xx"
var value:String{
get{
return strName
}
}
}
import Foundation
var obj = CValue()
println("\(obj.strName)")
6:属性监视器。
可以为除了延迟存储属性之外的其他存储属性添加属性监视器,也可以通过重载属性的方式 ,为继承的属性(包括存储属性和计算属性)添加属性监视器 。计算属性因为有set实际上就是它的属性监视器了。使用willSet/didSet。
class CMonitor{
var strName:String = ""
{
willSet(newStrName){
println("willSet : \(newStrName)")
}
didSet(newStrName){
println("didSet:\(strName)")
}
}
}
import Foundation
var monitor = CMonitor()
monitor.strName = "sc"
swift 属性的更多相关文章
- Swift属性
属性的存储 属性的主要作用是存储数据,可以常量属性和变量属 性: struct FixedLengthRange { var firstValue: Int let length: Int } var ...
- Swift—属性观察者-备
为了监听属性的变化,Swift提供了属性观察者.属性观察者能够监听存储属性的变化,即便变化前后的值相同,它们也能监听到. 属性观察者主要有以下两个: willSet:观察者在修改之前调用. didSe ...
- swift 属性和方法
属性和常量 如果创建了一个结构体的实例并赋值给一个常量,则无法修改实例的任何属性: let rangeOfFourItems = FixedLengthRange(firstValue: 0, len ...
- 学习swift从青铜到王者之swift属性09
1.结构体常量和类常量的存储属性 let p1 = Person1() //p1.age = 88 不允许修改 //p11.name = "yhx1" 不允许修改 var p11 ...
- swift属性观察者机智
为了让程序能在属性被赋值时获得执行代码的机会.swift提供了属性观察者机智,属性观察者其实就两个特殊的回调方法 willSet:被观察的属性即将被赋值之前自动调用该方法 didSet:被观察的属性被 ...
- Swift - 属性观察者(willSet与didSet)
属性观察者,类似于触发器.用来监视属性的除初始化之外的属性值变化,当属性值发生改变时可以对此作出响应.有如下特点: 1,不仅可以在属性值改变后触发didSet,也可以在属性值改变前触发willSet. ...
- Swift 属性 函数
如今看cocoachina上得文章越来越有质量了,果断分享一下 原文: http://www.cocoachina.com/newbie/basic/2014/0611/8773.html 函数 函 ...
- swift 属性值变化
如果创建了一个结构体的实例并将其赋值给一个常量,则无法修改该实例的任何属性,即使有属性被声明为变量也不行. 这种行为是由于结构体(struct)属于值类型.当值类型的实例被声明为常量的时候,它的所有属 ...
- Swift学习笔记 - Swift属性只读
在OC中我们经常用到只读属性,用readonly修饰一下就行了,但在Swift中已经不是这样修饰的了,下面记录一下Swift中只读属性的使用 在OC中的只读: //只读属性 @property(rea ...
随机推荐
- 实际遭遇并解决:类型“ASP.global_asax”同时存在的问题
将一个ASP.NET项目由预编译方式改为动态编译方式时,删除了bin文件夹中所有扩展名为.compiled文件以及文件名以App_Web_开头的文件. 访问却出现下面的错误: System.Web.H ...
- How Delete File with Readonly Permission?
class Program { static void Main(string[] args) { string file=@"E:\readme.txt"; try { File ...
- [Java Web] 5、JSP (1) 注释 & Scriptlet
>_<" 在JSP中支持两种注释的语法操作,一种是显式注释,这种注释客户端是允许看见的,另外一种是隐式注释,此种注释客户端是无法看见的. 显式注释语法: <!-- 注释内容 ...
- [BTS] WCF-OracleDB
When I insert some data to Oracle, BizTalk WCF-OracleDB throw this error. A message sent to adapter ...
- Spring之事件发布系统
springboot应用,启动spring容器大致有如下几个过程: 容器开始启动 初始化环境变量 初始化上下文 加载上下文 完成 对应的Spring应用的启动器的监听器可以监听以上的过程,接口如下: ...
- 通过Ruby On Rails 框架来更好的理解MVC框架
通过Ruby On Rails 框架来更好的理解MVC框架 1.背景 因为我在学习软件工程课程的时候,对于 MVC 框架理解不太深入,只是在理论层面上掌握,但是不知道如何在开发中使用 MVC ...
- mac系统安装php redis扩展
安装步骤如下: 1.下载redis扩展 下载地址:https://nodeload.github.com/nicolasff/phpredis/zip/master 2.下载下来是zip包 手动解压 ...
- android: SharedPreferences实现记住密码功能
既然是实现记住密码的功能,那么我们就不需要从头去写了,因为在上一章中的最佳实 践部分已经编写过一个登录界面了,有可以重用的代码为什么不用呢?那就首先打开 BroadcastBestPractice 项 ...
- Facebook is Hiring!
I am a software engineer in Facebook. I joined Facebook a year ago and now doing some iOS stuff. If ...
- EF性能之关联加载
鱼和熊掌不能兼得 ——中国谚语 一.介绍 Entity Framework作为一个优秀的ORM框架,它使得操作数据库就像操作内存中的数据一样,但是这种抽象是有性能代价的,故鱼和熊掌不能兼得.但是,通过 ...