ios - 非 -'@objc' 方法不满足 '@objc' 协议(protocol)的要求

标签 ios swift

<分区>

我已将以下内容放入 Playground 中以尝试理解这一点,但我只是没有:

import Foundation

@objc protocol Sample {

    var value: Int { get set }

    func increase()
    func decrese()

}

extension Sample {

    func increase() {
        value += 1
    }

    func decrease() {
        value -= 1
    }

}

class Test: Sample {

    var value: Int = 0

}

错误出现在 Testclass 声明旁边:

Non-'@objc' method 'increase()' does not satisfy requirement of '@objc' protocol 'Sample'

如果我在类中重新声明 increase()decrease(),则警告会消失。或者如果我从协议(protocol)中删除声明。有人可以解释一下吗?

编辑

我确实需要一个 Objective-C 类来符合这个协议(protocol),因此在开始时使用 @objc

最佳答案

问题是您在协议(protocol)扩展中定义了这些方法。这用于为协议(protocol)定义“默认实现”(即,如果类型未实现该方法,将调用协议(protocol)的实现)。

但是 Objective-C 没有协议(protocol)默认实现的概念。因此,将协议(protocol)声明为 @objc 并在 Swift 协议(protocol)扩展中具有默认实现是没有意义的。符合此协议(protocol)的 Objective-C 类将永远无法享受这些 Swift 默认实现。

关于ios - 非 -'@objc' 方法不满足 '@objc' 协议(protocol)的要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60152698/

相关文章:

ios - 如何使用 CoreData 从选定的 Collection View 单元格中获取标签文本?

objective-c - AVFoundation 将 Swift 代码更改为 Objective-C

ios - UITableViewController 在具有有效数据的 reloadData 上导致 NSRangeException

ios - ARKit 2 中的场景切换

ios - undefined symbol : _OBJC_CLASS_$_FIRAnalytics

ios - 在 Mac/Windows 上为 iPhone 编译 ARM .s

ios - 使用 performBackgroundTask 将多个核心数据插入分派(dispatch)到 NSPersistentContainer 时合并冲突

ios - Xcode 6.1 swift 自动完成和代码感知中断

ios - 在 Touches 中获取 SKSpriteNode 的属性

ios - 使用 BFTask 和 AWS SDK iOS v2 控制上传到 S3