可以将AnyObject视为普通对象吗?怎么样?

时间:2017-11-20 10:19:14

标签: ios swift xcode

我有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视为已分配给它的对象。

有什么建议吗?

3 个答案:

答案 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的其他协议。