我有AnyObject
var currentObject : AnyObject
其值取决于if语句:
if sender.tag == 1 {
currentObject = object1()
}
else if sender.tag == 2 {
currentObject = object2()
}
.....
etc
numberOfRowsInSection函数:
public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
return(currentObject.count)
}
cellForRowAt函数:
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath as IndexPath) as UITableViewCell
let p = currentObject.item[indexPath.row]
cell.textLabel?.text = p.something
return(cell)
}
我想在cellForRowAt函数中使用这一行来从不同的对象中检索单元格内容
let p = currentObject.item[indexPath.row]
我收到错误消息:'AnyObject'不是'NSIndexPath'的子类型
我希望将AnyObject视为已分配给它的对象。
有什么建议吗?
答案 0 :(得分:2)
AnyObject
可以视为所有对象的“基类”。
所以如果你有:
let index: AnyObject = IndexPath(item: 0, section: 0)
您可以通过将其转换为所需类型来使用它:
if let indexPath = index as? IndexPath {
// indexPath is type of IndexPath
}
并非所有AnyObject
都可以IndexPath
,这就是演员阵容失败的原因。
这是真正的基础学习。我建议你查看A Swift Tour by Apple。
答案 1 :(得分:0)
您所指的对象实际上是一个字典。对象不是以你正在思考的方式存在于Swift中的东西。
那就是说,您可能想要做的是按如下方式转换AnyObject:
if let myDict = currentObject.item as? [AnyObject],
let p = myDict[indexPath.row] {
// p is now an AnyObject, cast to whatever you need again
}
Swift是一种非常严格的语言,所以你需要确保Swift总是知道什么类型的东西。想象一下这个对象:
{
"id": 10,
"label": "hello world"
}
您可以像这样在Swift中提取id和标签:
let myObject: [String: AnyObject] = // import the above object as you please
let label = myObject["label"] as? String // cast to string so Swift knows what the type of the label is
let id = myObject["id"] as? Int // must cast again so Swift knows the type of the id.
希望这对你有所帮助:)
答案 2 :(得分:0)
强烈建议您不要使用这种方法。
使用基于协议的解决方案。
在您的示例中,两个类型都应该响应item
,因此声明协议
protocol HasItem {
var items : [MyType] { get }
}
我使用复数形式items
,因为类型是数组。
然后在对象类中采用协议
struct Object1 : HasItem {
var items = [MyType]()
}
struct Object2 : HasItem {
var items = [MyType]()
}
现在,您可以将currentObject
声明为HasItem
var currentObject : HasItem
由于编译器知道符合HasItem
的对象具有items
数组,因此可以完美地编译
let p = currentObject.items[indexPath.row]
numberOfRowsInSection
中的返回值不合逻辑。很有可能这是打算
return currentObject.items.count
请注意,return
不是一个函数,没有括号。
如果要在协议类型中使用其他常用属性和功能,则必须将其添加到协议中。
如果MyType
也可能属于不同类型,请使用具有属性something
的其他协议。