【问题标题】:Constraints on protocol crashes code execution协议崩溃代码执行的约束
【发布时间】:2018-04-09 21:48:27
【问题描述】:

我得到了这个代码:

import UIKit

protocol Test where Self: UIView {
    func printAnything()
}

class MyView: UIView, Test {
    func printAnything() {
        print("Anything")
    }
}

let myView: Test = MyView()
myView.printAnything()

约束是:where Self: UIView

当您将其粘贴到 Playground 时,它会在运行时崩溃并出现以下错误:

错误:执行被中断,原因:EXC_BAD_ACCESS (code=1, 地址=0x0)。

删除约束,确实删除运行时错误并打印“任何东西”。为什么添加的约束在运行时会崩溃?

运行 XCode 9.3 Swift 4.1

【问题讨论】:

    标签: swift


    【解决方案1】:

    为了将其限制为 Objective-C 类型,协议需要为@objc

    @objc protocol Test where Self: UIView {
        func printAnything()
    }
    

    这是一个已知缺陷:SR-7068

    【讨论】:

    • 奇怪的是,如果您将协议声明更改为protocol Test: AnyObject where Self: UIView {,该错误也会消失
    • @rmaddy 您是否收到有关冗余一致性的警告?如果我添加了: class,问题就消失了,但它添加了一个警告。
    • 在 Xcode 9.2 操场上,我没有收到关于我确实希望得到的冗余一致性的警告。使用class 代替AnyObject 也没有警告。
    猜你喜欢
    • 2012-03-30
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 2010-10-05
    相关资源
    最近更新 更多