注意:我是Swift的新秀
我正在使用Former。
我从领域模型中获取数据。
let industries = realm.objects(Industry)
然后我尝试从中定义InlinePickerItem
列表:
$0.pickerItems = industries.map({ industry in
return InlinePickerItem(title: industry.name, value: industry.id)
})
但XCode一直说:Cannot convert value of type 'Int' to expected argument type '_?'
,指向industry.id
。
我错过了什么吗?我不知道问题是来自Former还是来自我在Swift中无法理解的问题。例如,哪种类型是_?
?
更新:
@dfri评论后,尝试失败。从我对Swift的小理解中,我得知Swift迷路了。所以我从闭包中提取了InlinePickerItem
列表的初始化。
let industries = realm.objects(Industry)
let inlinePickerItems = industries.map({ industry in
return InlinePickerItem(title: industry.name, displayTitle: nil, value: industry.id)
})
let catRow = InlinePickerRowFormer<ProfileLabelCell, String>(instantiateType: .Nib(nibName: "ProfileLabelCell")) {
$0.titleLabel.text = "CATEGORY".localized
}.configure {
$0.pickerItems = inlinePickerItems
}
调用InlinePickerItem(title: industry.name, displayTitle: nil, value: industry.id)
时错误消失了,但在将$0.pickerItems
分配给Cannot assign value of type '[InlinePickerItem<Int>]' to type '[InlinePickerItem<String>]'
时我得到了新内容:
var task = UserManager.FindByIdAsync(User.Identity.GetUserId()); // Uses the same DB Context
DbContext.Stages.Add(...);
await task;
希望这会为您提供一些有用的提示。
答案 0 :(得分:1)
在重新分解代码之后(“update”之后),它现在显而易见的是错误的来源。
不可变catRow
的类型为InlinePickerRowFormer<ProfileLabelCell, String>
。从[InlinePickerRowFormer]的源代码我们看到该类及其属性pickerItems
声明如下
public class InlinePickerRowFormer<T: UITableViewCell, S where T: InlinePickerFormableRow> : ... { // ... public var pickerItems: [InlinePickerItem<S>] = [] // ... }
这里的关键是,对于实例InlinePickerRowFormer<T,S>
,其属性pickerItems
将是一个类型为InlinePickerItem<S>
的数组。在上面的示例中,S
为String
let catRow = InlinePickerRowFormer<ProfileLabelCell, String>
/* |
S = String */
因此pickerItems
是InlinePickerItem<String>
个实例的数组。
但是,您尝试将不可变inlinePickerItems
附加到pickerItems
,这意味着您尝试将InlinePickerItem<Int>
个实例的数组分配给类型为{{InlinePickerItem<String>
的数组。 1}};自然导致类型不匹配。
您可以通过以下方式解决此类型不匹配问题:
catRow
不可变设置为InlinePickerRowFormer<ProfileLabelCell, Int>
类型。