gpt4 book ai didi

ios - “任何对象?”不是 CustomClass 的子类型

转载 作者:可可西里 更新时间:2023-11-01 00:53:50 26 4
gpt4 key购买 nike

我有一个这样的闭包/ block

typealias TableViewConfigureBlock = (AnyObject?, AnyObject?) -> Void

它有两个参数:细胞对象和模型对象。因为我希望它是通用的,所以我使用了 AnyObject。

当我这样定义 block 时

var configureCellBlock : (ContactTableViewCell, Contact) -> Void = {cell, contactInfo in
cell.nameLabel.text = contactInfo.name
cell.numberLabel.text = contactInfo.number
cell.profileImageView.image = contactInfo.image
}

编译器报错

'AnyObject?' is not a subtype of 'ContactTableViewCell'

最佳答案

您的 typedef 定义了与实际闭包不同的参数。我的一般示例如下所示:

typealias MyClosureType = (AnyObject?, AnyObject?) -> ()

重点是你定义的闭包必须有相同的接口(interface),比如:

var closure: MyClosureType = { (first: AnyObject?, second: AnyObject?) -> () in
// ...
}

在闭包体内你可以检查参数的类型,比如

let cell = first as? UITableViewCell
let contactInfo = second as? String

if cell != nil && contactInfo != nil {
// do the tasks
} else {
println("ops, those parameters are not what I expected")
}

稍后您可以使用 AnyObject 参数调用该 block ,例如:

closure(12, "SampleText");
closure(nil, ["1024", "2048"]);

等,但这里的关键点是当您定义闭包时,您必须保持参数的类型如 typealias 所定义。


对于您的代码:

typealias TableViewConfigureBlock = (AnyObject?, AnyObject?) -> Void

对比

// I'm incorrect
var configureCellBlock : TableViewConfigureBlock = { (cell: ContactTableViewCell, contactInfo: Contact) -> Void in
// ...
}

接口(interface)和实现具有不同类型。如果你这样写,你会看到实现如何违反接口(interface):

// I'm incorrect
var configureCellBlock : (AnyObject?, AnyObject?) -> Void = { (cell: ContactTableViewCell, contactInfo: Contact) -> Void in
// ...
}

你需要在这里做这样的事情:

// I'm correct now
var configureCellBlock : (AnyObject?, AnyObject?) -> Void = { (cell: AnyObject?, contactInfo: AnyObject?) -> Void in
// ...
}

关于ios - “任何对象?”不是 CustomClass 的子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24609153/

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