我有一个名为Film的核心数据实体,它具有属性标题和日期.我注意到生成的NSManagedObject子类包含可选的NSManaged属性,即使我在核心数据检查器中将属性标记为非可选.
我可以手动将其更改为非可选属性,还是将其作为可选项更好的选择?为什么?
我正在将核心数据数据库中的对象列表加载到表视图中.
class ScheduleViewController: UITableViewController {
private var items: [AnyObject]?
// MARK: - Table view data source
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if let itemCount = items?.count {
return itemCount
}
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("DayScheduleCell", forIndexPath: indexPath) as DayScheduleCell
if let act = items[indexPath.row] as Activity {
if act.client != nil {
// ...
}
}
return cell
}
}
Run Code Online (Sandbox Code Playgroud)
在闭包内检索数据,因此我已将items数组声明为可选,因为它在第一次运行时可能为零.
我收到错误'[AnyObject]?' …
我正在 macOS 10.13.6 High Sierra 上使用 Xcode 10 + Swift 4.2。我创建了一个数据模型,并让 Core Data 自动为数据模型实体生成类。在大多数情况下,这按预期工作。但是,我无法弄清楚如何预测生成的类中的某些属性是否将成为Optional类型;它似乎并不取决于相应的属性是否被声明为“可选”(即在属性描述中选中了“可选”复选框)。有人可以帮我弄清楚 Xcode 如何确定是否将类属性设为可选吗?
这是我从我的项目中得出的一个小例子。我只是用虚构的名称替换了项目特定的名称,但其他一切都相同。首先这里是从数据模型中提取的 Foo 实体的描述:
<entity name="Foo" representedClassName="Foo" parentEntity="FooParent" syncable="YES" codeGenerationType="class">
<attribute name="v1" attributeType="Date" usesScalarValueType="NO" syncable="YES"/>
<attribute name="v2" attributeType="Boolean" usesScalarValueType="YES" syncable="YES"/>
<attribute name="v3" optional="YES" attributeType="Boolean" usesScalarValueType="YES" syncable="YES"/>
<attribute name="v4" optional="YES" attributeType="UUID" usesScalarValueType="NO" syncable="YES"/>
<attribute name="v5" optional="YES" attributeType="String" syncable="YES"/>
<relationship name="v6" toMany="YES" deletionRule="Nullify" destinationEntity="Bar"
inverseName="baz" inverseEntity="Bar" syncable="YES"/>
</entity>
Run Code Online (Sandbox Code Playgroud)
如您所见,v1、v2 和 v6 在数据模型中未声明为可选,而 v3、v4 和 v5 声明为可选。这是生成的代码,我在我的项目的 Xcode/DerivedData 文件夹下的 Foo+CoreDataProperties.swift 中找到了它。
extension Foo {
@nonobjc public …Run Code Online (Sandbox Code Playgroud) 我有一个存储在核心数据对象上的字段,称为"元数据",它是一种类型String(没有可选,因为Apple文档说不要乱用CD中的选项).有时,元数据字段为零.在检查此值是否为零时,我执行以下检查:
if object.metadata as String? != nil {
...
}
Run Code Online (Sandbox Code Playgroud)
但是,我的代码在这一行上不断崩溃EXC_BAD_ACCESS.我也尝试过:
if let metadata = object.metadata as String? {
...
}
Run Code Online (Sandbox Code Playgroud)
哪个也行不通.我成功地将对象转换为代码的其他部分中的选项,所以我不明白为什么这个特殊情况不起作用.如何检查核心数据属性是否为零字符串?
我不确定Swift和CoreData的最佳实践.你认为not null属性应该是可选的吗?
例如
import Foundation
import CoreData
class Item: NSManagedObject {
@NSManaged var itemId: String // Not null property
@NSManaged var itemPrice: String? // null is possible
}
Run Code Online (Sandbox Code Playgroud)
我想知道我应该通知其他程序员哪些属性不是null.
我想知道你通常做什么.这个问题听起来是基于意见的,但我确定如何处理可选项对其他人有帮助.
仅供参考我找到了类似的问题