gpt4 book ai didi

class - 如何在 Swift 中从字符串实例化类和初始化?

转载 作者:IT王子 更新时间:2023-10-29 05:47:53 27 4
gpt4 key购买 nike

我可以在 ObjC 中从字符串实例化类。例如,我通过子类化 UITableViewCell 定义了新的 DBCell 类,并且我使用这些代码从名称实例化类:

 DBCell *cell=[tableView dequeueReusableCellWithIdentifier:cellClassname];
if (cell==nil) {
Class cellClass=NSClassFromString(cellClassname);
cell=[cellClass alloc];
cell=[cell initWithStyle:cellStyle reuseIdentifier:cellClassname];
}

现在我需要将代码迁移到 Swift,我已经在 Swift 中重新定义了 DBCell 类:

 class DBCell: UITableViewCell {
var label:String?
var key:String?
var managedObject:NSManagedObject?
var delegate:AnyObject?
convenience override init(style: UITableViewCellStyle, reuseIdentifier: String!) {
self.init(style: style, reuseIdentifier: reuseIdentifier)
self.textLabel.font=UIFont.preferredFontForTextStyle(UIFontTextStyleCaption1)
self.backgroundColor=UIColor.blackColor()
self.textLabel.backgroundColor=UIColor.blackColor()
}
}

但是我怎样才能实例化类并调用适当的初始化函数呢?

最佳答案

Swift 是静态类型的,这使得它在运行时更安全。例如,如果任何字符串错误,您将崩溃(或者充其量什么都不做,这可能比崩溃更糟糕)并且编译器无法为您捕获它。

好的,但是你如何处理这种模式呢?在 Swift 中,IMO 最好的方法是显式创建映射。

let cellMapping = [
"DBCell": DBCell.self,
]

if let cellClass = cellMapping[cellClassName] {
let cell = cellClass(style: cellStyle, reuseIdentifier: cellClassName)
// use cell
}

现在,当您重构并更改 DBCell 的名称,但错过了 Storyboard 中的字符串时,一切都会继续按预期工作,而不是像在 ObjC 中那样崩溃或悄悄失败。

Swift 在这些映射方面也非常聪明。上面 cellMapping 的类型是 [String: DBCell.Type],所以如果你有一个特殊的 init 用于 DBCell,它将可用。但是如果你的字典看起来像:

let cellMapping = [
"DBCell": DBCell.self,
"OtherCell": UITableViewCell.self
]

那么类型就是[String: UITableViewCell.Type]。 Swift 会自动计算出涵盖所有值的最具体的类。如果你在这个列表中添加了一个没有你实际使用的方法的类型,Swift 可以在编译时捕获它。如果你犯了一个错误并添加了一些甚至不是表格 View 单元格的东西:

let cellMapping = [
"DBCell": DBCell.self,
"OtherCell": UITableViewCell.self,
"BadCell": UICollectionViewCell.self
]

然后 Swift 会给你一个编译时警告,告诉你你已经创建了一个 AnyObject。这对于编写安全但灵活的代码来说真的很棒,而所有这一切都是为了一本字典的成本。

关于class - 如何在 Swift 中从字符串实例化类和初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25864108/

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