将if子句转换为选项



我正试图在Swift中将许多if子句转换为optionals。let name语句仍有错误。我得到的错误是:

Type 'int' does not conform to protocol 'StringLiteralConvertible'.

我有两个问题:

  1. 我的新代码会和我的旧代码有同样的用途吗
  2. 我怎样才能消除这个错误

谢谢。

旧代码:

class func jsonAsUSDAIdAndNameSearchResults (json: NSDictionary) -> [(name: String, idValue: String)] {
var usdaItemsSearchResults: [(name: String, idValue: String)] = []
var searchResult: (name: String, idValue: String)
if json["hits"] != nil {
let results: [AnyObject] = json["hits"] as [AnyObject]
for itemDictionary in results {
if itemDictionary["_id"] != nil {
let idValue:String = itemDictionary["_id"] as String
if itemDictionary["fields"] != nil {
let fieldsDictionary: NSDictionary = itemDictionary["fields"] as NSDictionary
if fieldsDictionary["item_name"] != nil {
let name: String = fieldsDictionary["item_name"] as String
searchResult = (name: name, idValue: idValue)
usdaItemsSearchResults += [searchResult]
}
}
}
}
}
return usdaItemsSearchResults
}

新代码:

class func jsonAsUSDAIdAndNameSearchResults (json: NSDictionary) -> [(name: String, idValue: String)] {
var usdaItemsSearchResults: [(name: String, idValue: String)] = []
var searchResult: (name: String, idValue: String)
if json["hits"] != nil {
let results: [AnyObject] = json["hits"] as [AnyObject]
for itemDictionary in results {
let name: String? = itemDictionary["_id"]?["_fields"]?["item_name"]? as? String
let idValue:String? = itemDictionary["_id"]? as? String
if (name? != nil && idValue? != nil) {
searchResult = (name: name!, idValue: idValue!)
usdaItemsSearchResults += [searchResult]
}
}
}
return usdaItemsSearchResults
}

多亏了我们的大力支持,我们才得以实现目标。在这个新版本中,我得到了错误"使用未解析的标识符'name'"。该错误发生在流量控制CCD_ 2的级别。

这是新代码:

class func jsonAsUSDAIdAndNameSearchResults (json: NSDictionary) -> [(name: String, idValue: String)] {
var usdaItemsSearchResults: [(name: String, idValue: String)] = []
var searchResult: (name: String, idValue: String)
if json["hits"] != nil {
let results:[AnyObject] = json["hits"]! as [AnyObject]
for itemDictionary in results {
if let name = ((itemDictionary["_id"] as! NSDictionary)["_fields"] as! NSDictionary)["item_name"] as? String {break}
if let idValue = itemDictionary["_id"] as? String {break}
if (name? != nil && idValue? != nil) {
searchResult = (name: name!, idValue: idValue!)
usdaItemsSearchResults += [searchResult]
}
}
}
return usdaItemsSearchResults
}

Grimxn理应获得奖牌!我们快到了。下面的代码不再显示任何问题,但我们在运行它时遇到了断点。它似乎在强制转换方面有问题。

class func jsonAsUSDAIdAndNameSearchResults (json: NSDictionary) -> [(name: String, idValue: String)] {
var usdaItemsSearchResults: [(name: String, idValue: String)] = []
var searchResult: (name: String, idValue: String)
if json["hits"] != nil {
let results:[AnyObject] = json["hits"]! as [AnyObject]
for itemDictionary in results {
let fields: NSDictionary = (itemDictionary["_id"]? as NSDictionary)["_fields"]? as NSDictionary
let name:String? = fields["item_name"] as? String
let idValue:String? = itemDictionary["_id"]? as? String
if (name? != nil && idValue? != nil) {
searchResult = (name: name!, idValue: idValue!)
usdaItemsSearchResults += [searchResult]
}
}
}
return usdaItemsSearchResults
}

它被解决了。代码的工作原理如下。我钻错了。真的很感谢,我学到了很多:

class func jsonAsUSDAIdAndNameSearchResults (json: NSDictionary) -> [(name: String, idValue: String)] {
var usdaItemsSearchResults: [(name: String, idValue: String)] = []
var searchResult: (name: String, idValue: String)
if json["hits"] != nil {
let results:[AnyObject] = json["hits"]! as [AnyObject]
for itemDictionary in results {
let name:String? = (itemDictionary["fields"]? as NSDictionary)["item_name"] as? String
let idValue:String? = itemDictionary["_id"]? as? String
if (name? != nil && idValue? != nil) {
searchResult = (name: name!, idValue: idValue!)
usdaItemsSearchResults += [searchResult]
}
}
}
return usdaItemsSearchResults
}

问题已解决。代码的工作原理如下。我钻错了。真的很感谢,我学到了很多:

class func jsonAsUSDAIdAndNameSearchResults (json: NSDictionary) -> [(name: String, idValue: String)] {
var usdaItemsSearchResults: [(name: String, idValue: String)] = []
var searchResult: (name: String, idValue: String)
if json["hits"] != nil {
let results:[AnyObject] = json["hits"]! as [AnyObject]
for itemDictionary in results {
let fields: NSDictionary = itemDictionary["fields"]? as NSDictionary
let name:String? = fields["item_name"] as? String
let idValue:String? = itemDictionary["_id"]? as? String
if (name? != nil && idValue? != nil) {
searchResult = (name: name!, idValue: idValue!)
usdaItemsSearchResults += [searchResult]
}
}
}
return usdaItemsSearchResults
}

错误在let name: String? = itemDictionary["_id"]?["_fields"]?["item_name"]? as? String 行根据您的旧代码,您可以直接从itemDictionary中获取字段对象。

func jsonAsUSDAIdAndNameSearchResults (json: NSDictionary) -> [(name: String, idValue: String)] {
var usdaItemsSearchResults: [(name: String, idValue: String)] = []
var searchResult: (name: String, idValue: String)
if json["hits"] != nil {
let results: [AnyObject] = json["hits"] as [AnyObject]
for itemDictionary in results {
let name: String? = itemDictionary["_fields"]?["item_name"]? as? String
let idValue:String? = itemDictionary["_id"]? as? String
if (name? != nil && idValue? != nil) {
searchResult = (name: name!, idValue: idValue!)
usdaItemsSearchResults += [searchResult]
}
}
}
return usdaItemsSearchResults

}由于您在if循环中检查nil值,因此它应该可以工作。

最新更新