swift 声明属性中的属性有几种,有什么区别

Swift中的类型属性、方法
在Object-C中我们已经清楚的知道有实例方法、属性和类方法、属性,类方法只能有类去调用,而实例方法只能有类申请的实例去调用。而在Swift中同样遵守这个约定。
在Swift中有static、class两个修饰符,这两个修饰符的作用是一样的,但它们的使用场景是不一样的。
static:在枚举、结构体中修饰属性、方法,定义类型属性、类型方法。
class:在类中修饰属性、方法,定义类型属性、类型方法。
static var desc:String!
static var info:String
return &现在是\(desc)&
print(&尝试更改值为:\(newValue)&)
Week.desc=&周一&
static func setDesc(desc:String)
self.desc=desc
Week.setDesc(&礼拜一,该上班敲代码了&)
print(Week.desc)
这里举例了static在枚举中的应用,class在类中的应用,思路跟上面基本一致,希望大家能够触类旁通,这样才能提高自己,有什么问题可以给我留言,有问必答。1. 相比较于Java,Swift中属性很有意思,有很多分类:存储属性、计算属性和类型属性等等。
2. 存储属性
存储属性:一个存储属性就是存储在特定类或结构体的实例里的一个常量或变量,存储属性可以是变量存储属性(用关键字var定义),也可以是常量存储属性(用关键字let定义)。
如果创建了一个结构体的实例并赋值给一个常量,则无法修改实例的任何属性,即使定义了变量存储属性,代码如下:
let rangeOfFourItems = FixedLengthRange(firstValue: 0, length: 4)
// 该区间表示整数0,1,2,3
rangeOfFourItems.firstValue = 6
// 尽管 firstValue 是个变量属性,这里还是会报错
2.1&延迟存储属性
延迟存储属性是指当第一次被调用的时候才会计算其初始值的属性。在属性声明前使用lazy来标示一个延迟存储属性。必须将延迟存储属性声明成变量(使用var关键字),因为属性的值在实例构造完成之前可能无法得到。而常量属性在构造过程完成之前必须要有初始值,因此无法声明成延迟属性。
当属性的值依赖于在实例的构造过程结束前无法知道具体值的外部因素时,或者当属性的值需要复杂或大量计算时,可以只在需要的时候来计算它,这时候我们可以使用延迟存储属性。代码如下:
class DataImporter {
var fileName = "data.txt"
class DataManager {
lazy var importer = DataImporter()
var data = [String]()
let manager = DataManager()
manager.data.append(" new data")
imprter 前面的关键字是lazy,是延迟存储属性,DataManager也可能不从文件中导入数据。所以当DataManager的实例被创建时,没必要创建一个DataImporter的实例,更明智的是当用到DataImporter的时候才去创建它。
2.2&计算属性
除存储属性外,类、结构体和枚举可以定义计算属性,计算属性不直接存储值,而是提供一个 getter 来获取值,一个可选的 setter 来间接设置其他属性或变量的值。代码如下:
struct Point {
var x = 0.0 , y = 0.0
struct Size {
var width = 0.0 , height = 0.0
struct Rec {
var origin = Point()
var size = Size()
var center : Point {
let centerX = origin.x + (size.width / 2)
let centerY = origin.y + (size.height / 2)
return Point(x : centerX , y: centerY)
set(newCenter){
origin.x = newCenter.x - (size.width / 2)
origin.y = newCenter.y - (size.height / 2)
var square =
Rec(origin: Point(x: 0.0, y: 0.0), size: Size (width : 10.0 , height : 10.0))
let initialSquareCenter = square.center
square.center = Point(x : 15.0 , y: 15.0)
print("square.origin is now at (\(square.origin.x), \(square.origin.y))")
Rec提供了一个名为center的计算属性。Rec的计算属性center提供了自定义的 getter 和 setter 来获取和设置矩形的中心点,就像它有一个存储属性一样。
2.3&只读计算属性
只有 getter 没有 setter 的计算属性就是只读计算属性。只读计算属性总是返回一个值,可以通过点运算符访问,但不能设置新的值。代码如下:
struct Cuboid {
var width = 0.0, height = 0.0, depth = 0.0
var volume: Double {
return width * height * depth
let fourByFiveByTwo = Cuboid(width: 4.0, height: 5.0, depth: 2.0)
print("the volume of fourByFiveByTwo is \(fourByFiveByTwo.volume)")
// 输出 "the volume of fourByFiveByTwo is 40.0"
//只读计算属性的声明可以去掉get关键字和花括号
3.&属性观察器
属性观察器监控和响应属性值的变化,每次属性被设置值的时候都会调用属性观察器,甚至新的值和现在的值相同的时候也不例外。可以为属性添加如下的一个或全部观察器:
willSet在设置新的值之前调用
didSet在新的值被设置之后立即调用
看下面一段代码:
class StepCounter {
var totalSteps: Int = 0 {
willSet(newTotalSteps) {
print("About to set totalSteps to \(newTotalSteps)")
if totalSteps & oldValue
print("Added \(totalSteps - oldValue) steps")
let stepCounter = StepCounter()
stepCounter.totalSteps = 200
// About to set totalSteps to 200
// Added 200 steps
stepCounter.totalSteps = 360
// About to set totalSteps to 360
// Added 160 steps
stepCounter.totalSteps = 896
// About to set totalSteps to 896
// Added 536 steps
4.&类型属性
实例的属性属于一个特定类型实例,每次类型实例化后都拥有自己的一套属性值,实例之间的属性相互独立。也可以为类型本身定义属性,不管类型有多少个实例,这些属性都只有唯一一份。这种属性就是类型属性。值类型的存储型类型属性可以是变量或常量,计算型类型属性跟实例的计算属性一样定义成变量属性。
4.1&类型属性语法
使用关键字static来定义值类型的类型属性,类(class)定义类型属性。下面的例子演示了存储型和计算型类型属性的语法,代码如下:
struct SomeStructure {
static var storedTypeProperty = "Some value."
static var computedTypeProperty: Int {
// 这里返回一个 Int 值
enum SomeEnumeration {
static var storedTypeProperty = "Some value."
static var computedTypeProperty: Int {
// 这里返回一个 Int 值
class SomeClass {
static var computedTypeProperty: Int { // 这里返回一个 Int 值 } }
4.2&获取和设置类型属性的值
跟实例的属性一样,类型属性的访问也是通过点运算符来进行,但是,类型属性是通过类型本身来获取和设置,而不是通过实例。比如:
putedTypeProperty)
// 输出 "42"
print(SomeStructure.storedTypeProperty)
// 输出 "Some value."
SomeStructure.storedTypeProperty = "Another value."
print(SomeStructure.storedTypeProperty)
// 输出 "Another value.&
阅读(...) 评论()在 SegmentFault,解决技术问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
一线的工程师、著名开源项目的作者们,都在这里:
获取验证码
已有账号?
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
var displayValue: Double {
return NSNumberFormatter().numberFromString(display.text!)!.doubleValue
display.text = "\(newValue)"
userIsInTheMiddleOfTypingANumber = false
这段代码大概是获取名叫display的label中的String字符串转换为Double赋值给displayValue的作用。
但是还是不怎么能看明白,求高手帮忙解释下各段代码的功能,谢谢。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
我也在学这个,说说我自己的理解。
“除存储属性外,类、结构体和枚举可以定义计算属性,计算属性不直接存储值,而是提供一个 getter 来获取值,一个可选的 setter
来间接设置其他属性或变量的值。”
摘录来自: Unknown. “The Swift Programming Language 中文版”。 iBooks.
这个功能的重点作用应该是在计算上。
对于一般的属性,要么直接存一个,要么直接读一个,计算属性则可以根据所设置内容,进行一些修改或计算之类的, 比如:
// Playground - noun: a place where people can play
import UIKit
struct Person {
var firstName = "San"
var lastName = "Zhang"
var fullName: String {
return firstName + "." + lastName
set(newName) {
var name = ponentsSeparatedByString(".")
firstName = name[0]
lastName = name[1]
var p = Person()
p.fullName
p.fullName = "Si.Lee"
p.firstName
p.lastName
在Playground中输入是这样的:
其中这个fullName就是一个计算属性了。我个人理解,这种做法就是一种动态的属性了。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
我的理解是get是说你要取出这个值的时候要进行的操作,set是你要设置这个值的时候进行的操作,newValue好像是保留的一个东西。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
就是私有成员属性 然后通过public func getXXX和public setXXX的语法糖
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:在Swift中,对类进行定义时,可以定义三种属性:
* 常量属性
* 变量属性
* 监测属性值的变化
一.对象属性
1.常量属性
常量属性在对象被创建出来后就不能被修改,为常量赋值只能在对象初始化时修改。
class fog{
let name="xxx"
init(name:String){
self.name=
var obj=fog(name:"ricky")
2.变量属性
var name=""
懒加载也叫延迟加载,很多时候,类对象的属性不一定是必要的,或者在刚创建的时候,不确定它是否将会被使用。如果在创建对象的时候,就对该对象进行了初始化或者加载,则是对资源的浪费。
为了解决这个问题,Swift提供了懒加载的机制,即只有在正式使用到某个属性的时候,才会加载该属性。懒加载使用关键字lazy:
class City{
print("ok")
class Metro{
var name=""
lazy var city=City()
var line=Metro()
line.name="No One"
print(line.name)
//以上不会执行print("ok")因为没有用刀City
var City=line.city
//延迟10秒,打印"ok"
4.监测属性值的变化
Swift提供了一种很方便的观察者模式的实现方式。当对对象的属性值进行赋值时,可以使用WillSet和didSet进行对象属性值变化的观察。
WillSet和didSet表示变量的即将改变和已经改变的通知方法:
class Change{
init(name:String){
var userName:String{
print("willSet----\(newValue)")
print("didSet"----\(oldValue))
在对属性值添加观察时候,可以使用默认参数名newValue和oldValue。使用初始化方法时,不会调用属性值观察。
对类对象属性的观察不能用于已经设置为懒加载的属性。
二.运算属性
Swift提供的运算属性并不是用来存储值的属性,也就是说它不能用来存储实际的数值(赋给它的值不一定就是该属性的值),而是相当于函数,只是这个函数被封装成了属性的形式,而且包含有getter和setter方法。
class Square{
var width=0
var round:Int{
return width*4
width=newValue/4
static var maxNum=0
本文已收录于以下专栏:
相关文章推荐
Swift中类的属性有多种
存储属性:存储实例的常量和变量
计算属性:通过某种方式计算出来的属性
类属性:与整个类自身相关的属性一、存储属性存储属性是最简单的属性,它作为类实例的一部分,用于存储...
Swift的内部类比较鸡肋,在内部类里面不能调用外部类的属性或方法,那么如何解决这个问题,把内部类里面调用外部类的那部分代码方法移动到外部类里面,成为外部类的方法,是一种变通解决方式。
值类型和引用类型中可以通过外部访问的成员(除了方法外)都叫做属性。
swift中到底存在多少种属性?
1.存储属性
类和结构体的成员变量或者成员常量都属于存储属性。
struct FixedLengt...
类的构造方法原理和OC差不多 , 只是属性手动赋值时 , 有些麻烦 , 也有些难以理解 , 不过幸好有KVC , 解决了大部分问题 . 至于属性观察 , 调用的方法想必也不陌生 , 不错 , 正是OC...
转载自:http://southpeak.github.io/blog//ios-swift-property/#comments
Swift属性Property
最近在学习swift2.x,在运用计算属性时出现了一些问题,例如下面这段代码:
import Foundation
class Test {
var testVar:Int {
类定义我们通过关键字class和struct来分别表示类和结构体,并在一对大括号中定义它们的具体内容/*
class SomeClass {
// class definition goes he...
// 结构体 和 类
// 在Swift中,结构体被做了很对强化 几乎所有的数据类型都是用结构体实现的
// 相同点: 1.都可以定义变量 2.都可以定义方法 3.都可以定义构造器 Int
// 结构体和类
// 在swift中,结构体被做了很多强化,几乎所有的数据类型都是用结构体实现的,
// 相同点:1.都可以定义变量 2.都可以定义方法 3.都可以定义构造器 init 4.都...
main.swift
Created by lanou on 16/10/27.
Copyright (c) 2016年 lanou. ...
他的最新文章
讲师:刘文志
讲师:陈伟
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 swift属性set get方法 的文章

 

随机推荐