我正在一个同时使用Objective-C(旧代码)和Swift(新代码以及将来添加的任何代码)的项目中
我在CoreData模型中创建了两个新实体,我们将它们称为“文件夹”和“文件”。文件夹与文件有一对多的关系。
这是到目前为止我从自动生成的子类中提到的代码:
@interface Folder (CoreDataProperties)
+ (NSFetchRequest<Folder *> *)fetchRequest;
....
@property (nullable, nonatomic, retain) NSSet<File *> *files;
....
@end
@interface File (CoreDataProperties)
+ (NSFetchRequest<File *> *)fetchRequest;
....
@property (nullable, nonatomic, retain) Folder *folder;
....
@end
我正在处理Swift文件中的Folder记录,而我只是想通过Folder.files关系设置我在另一页上拥有的属性。
这是我要设置的另一个(“快速”)页面上的属性:
class FilesTableViewCell: UITableViewCell {
...
var filesArray: [File]? = []
...
}
所以我试图将特定文件夹记录的文件设置为该属性:
//some other Swift file
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
...
let cell = tableView.dequeueReusableCell(withIdentifier: FilesTableViewCellIdentifier) as! FilesTableViewCell
let currentFolder = folderArray.last
cell.filesArray = currentFolder?.files
// the line does not work I get a "Cannot assign value of type 'Set<File>?' to type '[File]?'" error
return cell
....
即使我在“ currentFolder?.files”的前面添加“(数组)”,我仍然会遇到以下错误:
"Cannot assign value of type '(Array<_>).Type' to type '[File]?'"
我对Swift的经验不足,所以有人可以帮助我了解为什么它不起作用以及潜在的解决方案吗? (在这一点上,我将只需要对所有文件夹的文件进行核心数据提取,但是我宁愿不必那么低效)
答案 0 :(得分:1)
请注意,files
不是Array
,而是Set
。 Set与array的不同之处在于它没有顺序,因此每次迭代Set
顺序时(每次)都会不同。 Set
确保一个对象只能添加一次,因此,如果您向Set
添加两个相同的对象,则它将仅包含一个对象-因此不会重复。
要从Array
获取Set
,只需执行Array(yourSet)
,如果yourSet的类型为Set<File>
,则数组的类型为[File]
您可以将代码更改为:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
...
let cell = tableView.dequeueReusableCell(withIdentifier: FilesTableViewCellIdentifier) as! FilesTableViewCell
if let currentFolder = folderArray.last, let files = currentFolder.files {
let filesArray = Array(files)
cell.filesArray = filesArray
}
return cell
....
}