gpt4 book ai didi

ios - 不支持覆盖扩展中的非@objc 声明

转载 作者:搜寻专家 更新时间:2023-10-31 08:16:03 25 4
gpt4 key购买 nike

似乎不知从何而来,我开始收到与我经常使用的两个扩展函数相关的数百个错误。

我尝试注释掉出现此错误之前的所有新代码。我还尝试清理我的构建文件夹。我如何摆脱这篇文章标题中发现的错误?为什么我已经成功使用这些扩展几个月了,它却随机出现?

extension UITableViewCell {

public func getSize(large: CGFloat, medium: CGFloat, small: CGFloat) -> CGFloat {
var size = CGFloat()
let screenHeight = Int(UIScreen.main.bounds.height)
if screenHeight >= 800 {
size = large
} else if screenHeight >= 600 {
size = medium
} else {
size = small
}
return size
}

public func formatPrice(_ price: Int) -> String {
let lastDigit = price % 10
var stringPrice = ""
if lastDigit == 0 {
stringPrice = "$\(Double(price) / 100)0"
} else {
stringPrice = "$\(Double(price) / 100)"
}
return stringPrice
}

}

最佳答案

如果您在扩展中向类添加函数(即它们不在类定义中),那么这些方法将在 swift 中静态分派(dispatch),因为编译器无法将方法添加到类的 vtable(即需要创建 vtable在编译时,但您可以稍后添加扩展,例如在另一个模块中)。这就是编译器提示您不能覆盖方法(即它们是非虚拟的)的原因。

Objective C 调度的工作方式不同,通过选择器表,甚至可以在运行时修改。这就是为什么编译器说使用 @objc 并且如果你这样做它肯定会工作。

示例:

这不会编译,因为我们试图在 swift 中覆盖和动态调度静态调度的非虚函数

extension UITableViewCell {
func a() {
print("UITableViewCell")
}
}

class B: UITableViewCell {
override func a() {
print("B")
}
}

let b = B()
print(b.a())

这行得通并打印“B”,因为它使用了 objc 选择器分派(dispatch)

import UIKit
import PlaygroundSupport

extension UITableViewCell {
@objc func a() {
print("UITableViewCell")
}
}

class B: UITableViewCell {
override func a() {
print("B")
}
}

let b = B()
print(b.a())

关于ios - 不支持覆盖扩展中的非@objc 声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55364212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com