gpt4 book ai didi

ios - 如何执行从 NSClassFromString 转换而来的类的类方法?

转载 作者:搜寻专家 更新时间:2023-11-01 07:21:10 25 4
gpt4 key购买 nike

我尝试使用从 NSClassFromString 创建的类来执行类方法,但我失败了。

在 Objective-C 中,这很容易:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:[NSClassFromString(reuseIdentifier) cellStyle] reuseIdentifier:reuseIdentifier];
if (self) {
let sel = #selector(CTFeedbackTopicCellItem.cellStyle())
// Initialization code
}
return self;
}

在 Swift 中这并不容易:

override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
if let reuseIdentifier2 = reuseIdentifier
{
if let class2 = NSClassFromString(reuseIdentifier2) as? NSObjectProtocol
{
let sel = #selector(CTFeedbackCellItem.cellStyle())

if let class3 = class2 as? CTFeedbackCellItem
{
super.init(style: class3.cellStyle, reuseIdentifier: reuseIdentifier2)
}
}
}
}

到目前为止,我的 Swift 代码中显示的错误是:
1. '#selector' 的参数不引用 '@objc' 方法、属性或初始化程序。
2.静态成员“cellType”不能用于“CTFeedbackCellItem”类型的实例

最佳答案

试试这个:

override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
guard let reuseIdentifier = reuseIdentifier else {
fatalError("bad usage")
}
guard let itemClass = NSClassFromString(reuseIdentifier) as? CTFeedbackCellItem.Type else {
fatalError("bad reuseIdentifier")
}
super.init(style: itemClass.cellStyle(), reuseIdentifier: reuseIdentifier)
}

(如果您已将 cellStyle 实现为类属性,请将 itemClass.cellStyle() 更改为 itemClass.cellStyle。)

类对象不是类的实例,所以你不应该像实例一样强制转换它。如果要调用类方法,请将其转换为元类。无需使用 #selector

关于ios - 如何执行从 NSClassFromString 转换而来的类的类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38919149/

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