只读属性

54

我需要在Swift中处理“只读”。我尝试了各种方法,但是无法编译通过。以下是问题和我的想法。

创建一个名为isEquilateral的只读计算属性,用于检查三角形的所有三条边是否具有相同的长度,如果是,则返回true;否则返回false。

var isEquilateral: Int {

}

5
这是个不错的开端。现在填写正文部分。例如 return side1 == side2 && side2 == side3,其中 side1, side2side3 是您类/结构体的属性。哦,isEquilateral 应该是 Bool 类型,而不是 Int - vacawama
3个回答

159
如果你想要一个只读的存储属性,可以使用private(set):
private(set) var isEquilateral = false

如果它是从其他属性计算而来的属性,那么是的,使用计算属性:

var isEquilateral: Bool {
    return a == b && b == c
}

为了完整起见,并且可能是不必要的,如果它是一个常量,你只需要使用 let


let isEquilateral = true

或者

struct Triangle {
    let a: Double
    let b: Double
    let c: Double

    let isEquilateral: Bool

    init(a: Double, b: Double, c: Double) {
        self.a = a
        self.b = b
        self.c = c

        isEquilateral = (a == b) && (b == c)
    }
}

如果您想要一个公开导出的属性,例如来自框架,您可以将public和internal限定符组合如下:`public internal(set) var isEquilateral = false`以允许模块中的其他类更新该属性或者...`public private(set) var isEquilateral = false`如果您只希望类实现更新该属性。 - Jason Crocker

27

像这样吗?(正如在评论中建议的@vacawama

struct Triangle {
    let edgeA: Int
    let edgeB: Int
    let edgeC: Int

    var isEquilateral: Bool {
        return (edgeA, edgeB) == (edgeB, edgeC)
    }
}

让我们来测试一下

let triangle = Triangle(edgeA: 5, edgeB: 5, edgeC: 5)
triangle.isEquilateral // true
或者
let triangle = Triangle(edgeA: 2, edgeB: 2, edgeC: 1)
triangle.isEquilateral // false

2
太棒了!谢谢。请告诉我一些事情。为什么我不能只说 return edgeA == edgeB == edgeC? - AllocSystems
2
@AllocSystems 不用谢。在 Swift 中,语法 edgeA == edgeB == edgeC 是 __无效的__。但是,如果你想避免我在代码中使用的元组,你可以写成 edgeA == edgeB && edgeB == edgeC - Luca Angeletti
好的回答。(点赞。)顺便说一句,我认为 edgeA == edgeB && edgeB == edgeC 语法比元组语法更可取,因为你可以一眼看出代码在做什么。使用元组时,你必须仔细阅读它正在做什么才能推理逻辑。 - Rob
1
我同意@Rob,多年后再次看到这个,我发现元组比较更难阅读。 - Luca Angeletti

11

只读属性是指具有getter但没有setter的属性。它始终用于返回一个值。

class ClassA {
    var one: Int {
        return 1
    }
    var two: Int {
        get { return 2 }
    }
    private(set) var three:Int = 3
    init() {
        one = 1//Cannot assign to property: 'one' is a get-only property
        two = 2//Cannot assign to property: 'two' is a get-only property
        three = 3//allowed to write
        print(one)//allowed to read
        print(two)//allowed to read
        print(three)//allowed to read
    }
}
class ClassB {
    init() {
        var a = ClassA()
        a.one = 1//Cannot assign to property: 'one' is a get-only property
        a.two = 2//Cannot assign to property: 'two' is a get-only property
        a.three = 3//Cannot assign to property: 'three' setter is inaccessible
        print(a.one)//allowed to read
        print(a.two)//allowed to read
        print(a.three)//allowed to read
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接