【问题标题】:Infinite loop in protocol confirmed enum variable协议中的无限循环确认枚举变量
【发布时间】:2015-09-10 11:11:30
【问题描述】:

在 Xcode7.0 GM Seed 中,我尝试了这段代码。

import UIKit

protocol P {
    var n: String { get }
}

enum E: Int, P {
    case A = 0
    case B = 1
    var n: String {
        return "aa"
    }
}

class C {
    var v1: String {
        print("-- 2 --")
        return v2.n
    }

    var v2: P! {
        didSet {
            print("-- 1 --")
            print(v1)
        }
    }
}

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let c = C()
        c.v2 = E(rawValue: 0)
    }
}

期待

-- 1 --
-- 2 --
aa

但结果是,

-- 1 --
-- 2 --
-- 1 --
-- 2 --
-- 1 --
-- 2 --
...

然后崩溃!

当我调用 v2.n 时,v2.didSet 也会被调用。 于是无限循环发生了。

这只发生在 Xcode7(Swift2) iOS8,9 中。 我在Xcode6.4中尝试了同样的代码,但是没有进入死循环。

这是 Swift2 中可能存在的错误吗?

【问题讨论】:

  • 我认为这是一个错误。与 Apple 一起提出。

标签: ios swift swift2 xcode7


【解决方案1】:

这绝对是一个错误,因为这只会与协议结合使用。

协议必须同时支持引用类型和值类型。所以他们在调用 set 和 get 时可能会有一些奇怪的行为。但是在这种情况下,如果您将协议类型替换为类或结构,它们都不会产生这种影响,即使只访问了 getter,也会调用 setter。总之,协议不必具有此行为即可与这两种类型一起使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 2011-10-14
    • 2021-12-22
    • 1970-01-01
    相关资源
    最近更新 更多