我最近将我的项目更新为Swift 4,现在当我扫描我的Amazon数据库时,属性返回nil。这是我的扫描码:
let scanExpression = AWSDynamoDBScanExpression()
scanExpression.filterExpression = "contains(Name, :name)"
scanExpression.expressionAttributeValues = [":name": (user?.username)!]
dynamoDBObjectMapper.scan(DBPerson.self, expression: scanExpression).continueWith(block: { (task:AWSTask!) -> Any? in
if let error = task.error as NSError? {
print("The request failed. Error: \(error)")
} else if let paginatedOutput = task.result {
DispatchQueue.main.async(execute: {
self.people.removeAll()
for person in paginatedOutput.items as! [DBPerson] {
self.people += [person] //breakpoint here
}
self.tableView.reloadData()
})
}
return nil
})
我的DBPerson课程:
import AWSDynamoDB
class DBPerson : AWSDynamoDBObjectModel, AWSDynamoDBModeling {
var Name: String?
var Occupation: String?
class func dynamoDBTableName() -> String {
return "People"
}
class func hashKeyAttribute() -> String {
return "Name"
}
}
我在扫描循环中设置一个断点来查看我的属性,它们总是以零结束。我的项目在更新Swift 4之前正在工作,在我的表中显示了属性。我已经尝试将Name和Occupation(在DBPerson类中)的类型更改为NSString,NSArray等内容,甚至是像Substring和CFString一样在黑暗中拍摄。
我的DynamoDB表中包含值,并返回正确的项数,但属性值始终为nil。这是我表中的示例项目:
{
"Name": "Bill",
"Occupation": "Firefighter"
}
除了转换回Swift 3之外,还有其他解决方案吗?感谢。
答案 0 :(得分:2)
这是由于推理@objc
的Swift 4行为更改发生了变化。您需要使用@objc标记ObjectiveC可用的属性,或使用@objcMembers
标记ObjectiveC可用的所有类属性
有关示例,请参阅: https://github.com/aws/aws-sdk-ios/issues/750#issuecomment-337046816