Swift学习之属性

属性

1.存储属性 就是存储在特定类或者结构体的实例的一个变量或者常量
struct FixedLengthRange {
    var firstValue = 3
    var length = 4
}

let fixLengthRange = FixedLengthRange()
print(fixLengthRange.firstValue)
//fixLengthRange.firstValue = 4 因为fixLengthRange 是常量,其所有的属性值都不能在被修改

class dataImporter {
    var fileName = "test.txt"
}

class dataManager {
    //必须被初始化
    lazy var importer = dataImporter()
    var data = [String]()
}

let manager = dataManager()
//importer现在还没被创建
manager.data.append("some data")
manager.data.append("another data")

print(manager.importer.fileName)//importer现在被创建
2.计算属性
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()

    var center :Point{
        get{
            let centerX = origin.x + (size.width / 2)
            let centerY = origin.y + (size.height / 2)
            return Point(x: centerX, y: centerY)
        }
        //1.第一种setter方式
        //set(newCenter){
            //origin.x = newCenter.x - (size.width/2)
            //origin.y = newCenter.y - (size.height/2)
        //}
        //2.第二种setter方式
        set{
            origin.x = newValue.x - (size.width/2)
            origin.y = newValue.y - (size.height/2)
        }
    }
}

var square = Rect(origin:Point(x: 3, y: 3), size:Size(width: 3, height: 3))
print(square)

//如果一个计算属性只是可读的,可以省略get{}
struct Cubiod {
    var width = 0.0
    var volume :Double {
        return width * width * width
    }
}
3.属性观察器 observer

willSet :在属性的值在被赋值之前调用

didSet:在属性的值被赋值之后调用

class StepCounter {
    var totalSteps:Int = 0 {

        willSet{
            print("totalSteps is \(newValue)")
        }

        didSet{
            if totalSteps > oldValue{
                print("totalSteps is big than oldValue")
            }
        }
    }
}

var stepCounter = StepCounter()
stepCounter.totalSteps = 10

//类属性,用static来声明,用类或者结构体、枚举来访问,而不是类或者结构体、枚举的实例对象也访问
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Swift 中,可以使用协议来限制属性的特定实现。下面是一些示例: 1. 只读属性协议 我们可以定义一个只读属性协议,让遵循该协议的类型只能实现只读属性: ``` protocol ReadOnlyProperty { var value: Int { get } } struct MyStruct: ReadOnlyProperty { let value: Int } ``` 在上面的代码中,`ReadOnlyProperty` 协议定义了一个只读属性 `value`。然后,我们定义了一个结构体 `MyStruct`,该结构体遵循 `ReadOnlyProperty` 协议,并实现了只读属性 `value`。 2. 可写属性协议 我们可以定义一个可写属性协议,让遵循该协议的类型只能实现可写属性: ``` protocol WritableProperty { var value: Int { get set } } struct MyStruct: WritableProperty { var value: Int } ``` 在上面的代码中,`WritableProperty` 协议定义了一个可读写属性 `value`。然后,我们定义了一个结构体 `MyStruct`,该结构体遵循 `WritableProperty` 协议,并实现了可写属性 `value`。 3. 只写属性协议 我们可以定义一个只写属性协议,让遵循该协议的类型只能实现只写属性: ``` protocol WriteOnlyProperty { var value: Int { set } } class MyClass: WriteOnlyProperty { var value: Int = 0 } ``` 在上面的代码中,`WriteOnlyProperty` 协议定义了一个只写属性 `value`。然后,我们定义了一个类 `MyClass`,该类遵循 `WriteOnlyProperty` 协议,并实现了只写属性 `value`。 通过以上示例,我们可以看到如何使用协议来限制属性的特定实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值