iOS Swift No.10 - 属性

第十章 属性

2. Computed Properties (计算属性)

除了存储属性以外,结构体枚举可以定义计算属性,而计算属性不会像存储属性那样结构体和类那样存储常量和/或变量的值,计算属性则是提供getter和可选的setter(setter?)来间接地检索或/和设置其他属性或值。
在这里插入图片描述

// 初始化X和Y轴的点
struct Point {
    var x = 0.0, y = 0.0
}
// 初始化宽和高的数值
struct Size {
    var width = 0.0, height = 0.0 
}
// 形成的长方形结构体
struct Rect {
	// 引用结构体Point和Size
    var origin = Point()
    var size = Size()
    // 长方形结构体的变量属性
    var center: Point {
        // 获取center后Point的X和Y轴的点 
        get{
            // 重新赋值
            let centerX = origin.x + (size.width / 2)
            let centerY = origin.y + (size.height / 2)
            // 返回X和Y轴的点给变量center
            // 变量center引用的是Point结构体
            return Point(x: centerX, y: centerY)
        }
        // 设置新的Point结构体
        set(newCenter){
           	// 改变原有的X点
            origin.x = newCenter.x - (size.width / 2)
            // 改变原有的Y点
            origin.y = newCenter.y - (size.height / 2)
        }
    }
}
// 创建新的正方形变量,该变量引用了长方形中的点和长宽尺寸
var square = Rect(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))")

2.1 Shorthand Setter Declaration (简写setter的定义)

有些时候计算属性里面的setter没用定义新的参数名,newValue这个默认的参数名就会被应用在setter里面。下面是省略setter参数名的结构体Rect的表达。

struct AlternativeRect {
    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)
        }
        // 在这里省略掉set的参数名newValue
        set {
            origin.x = newValue.x - (size.width / 2)
            origin.y = newValue.y - (size.height / 2)
        }
    }
}

2.2 Shorthand Getter Declaration (简写getter的定义)

如果这个getter的主体只是一个单一的表达,这个时候getter可以隐含地返回这个表达式,就此省略return关键字,详细参考函数章节中的隐含返回函数(Functions with an implicit return) 其实就是该getter或函数是由返回值的 而是没有注明,基于Swift语言特性该返回是默认进行的。下面这个例子就是简写getter之后的Rect结构体。

struct CompactRect {
    var origin = Point()
    var size = Size()
    var center: Point {
    	// 获取 + - * / 运算后结构体Point的X和Y轴上的点
        get {
        	// 现在Point中的X的值进行可 + (size.width / 2)的运算了
            Point(x: origin.x + (size.width / 2),
                  y: origin.y + (size.height / 2))
                  // 隐匿返回了return的值
                  // 也就是省略了
                  // return Point(x: origin.x, y: origin.y)
        }
        set {
            origin.x = newValue.x - (size.width / 2)
            origin.y = newValue.y - (size.height / 2)
        }
    }
}

2.3 Read-Only Computed Properties (只读计算属性)

一个只有getter没有setter的计算属性,我们称之为只读计算属性。只读属性都会有一个返回值。我么可以用dot语法来读取该属性值,但是不能给只读属性设置另一个值。可以在只读计算属性里面省略掉get关键字和它的大括号({ })。

struct Cuboid {
    var width = 0.0, height = 0.0, depth = 0.0
    var volume: Double {
    	// 只读计算属性里 
    	// 可以省略get关键字和它的大括号
        return width * height * depth
    }
}
let fourByFiveByTwo = Cuboid(width: 4.0, height: 5.0, depth: 2.0)
print("the volume of fourByFiveByTwo is \(fourByFiveByTwo.volume)")
发布了12 篇原创文章 · 获赞 71 · 访问量 1291

猜你喜欢

转载自blog.csdn.net/weixin_45026183/article/details/105172716
今日推荐