【问题标题】:Gives all of them optional value赋予所有这些可选值
【发布时间】:2016-09-01 08:20:07
【问题描述】:

您好,我有变量,但给了所有变量Optional()。我如何在下面解决我的代码。

下面你可以看到koltuklarkoltuklaridler数组的Json附加代码

        for name in json as! [AnyObject] {

            let SeatName = name["SeatName"]
            let SeatDesignId = name["SeatDesignId"]
            self.koltuklar.append("\(SeatName)*\(SeatDesignId)*")

            if let blogs = json["SeatDetail"] as? [[String: AnyObject]] {
                for blog in blogs {

                    let TicketTypeId = blog["TicketTypeId"]
                    let TicketTypeName = blog["TicketTypeName"]
                    let Amount = blog["Amount"]

                    self.koltuklaridler.append("\(SeatDesignId)*\(TicketTypeId)*\(TicketTypeName)*\(Amount)*")


                }

            }

在下面您可以看到代码中的 tableview(该代码在 koltuklaridler 内部搜索 id 后打开 koltuklar 索引路径项,当找到时从中获取一些变量)

var koltuklar = [""]
var koltuklaridler = [""]

if let myStrings:String! = koltuklar[indexPath.row]{

    print("\(myStrings!)")

    let myStringArrf = myStrings.componentsSeparatedByString("*")


    print("\(myStringArrf)")


    if let koltukisims:String! = String(myStringArrf[0]) {

        cell.koltukName.text = koltukisims
    }


    print(" STR - \(myStringArrf[1] as String!)")


    if let index = koltuklaridler.indexOf(myStringArrf[1] as String!) {

        let myStringdetaysecilen = koltuklaridler[index]

        print("myStringdetaysecilen \(myStringdetaysecilen)")


    }

也是我的json文件

[
    {
        "SeatDesignId": 16484,
        "SeatName": "A6",
        "SaloonId": 148,
        "SeatDetail": [
            {
                "TicketTypeId": 1,
                "TicketTypeName": "Okay",
                "Amount": 13
            }
        ]
    },

输出

Optional("A17")*Optional(16254)*
["Optional(\"A17\")", "Optional(16254)", ""]
STR - Optional(16254)

所有变量输出可选我尝试了所有方法但没有修复。

【问题讨论】:

  • 只需删除不必要的类型注释(以及 as String! 演员表)。除非编译告诉你,否则不要注释类型。
  • PS:在as 演员表中,as 总是带感叹号/问号,而不是下面的类型。
  • @vadian 我删除了所有字符串! s 但都是可选的!
  • 问题是你已经添加了可选字符串。每当您使用字符串插值"\(...)" 时,请确保所有字符串都已解包。从字典中读取的值总是可选。
  • 再一次:从字典中检索到的所有字符串(实际上是所有内容)根据定义都是可选的,因为如果键不存在,您会得到nil

标签: ios swift variables


【解决方案1】:

正如我在 cmets 中提到的,无论何时使用字符串插值"\(...)",请确保所有可选字符串都已解包。从字典中读取的值始终是可选的

此代码解开所有可选字符串

for name in json as! [[String:AnyObject]] {

  guard let SeatName = name["SeatName"] as? String,
        SeatDesignId = name["SeatDesignId"] as? Int else  {
      continue
  }
  self.koltuklar.append("\(SeatName)*\(SeatDesignId)*")

  if let blogs = json["SeatDetail"] as? [[String: AnyObject]] {
    for blog in blogs {
      if let TicketTypeId = blog["TicketTypeId"] as? Int,
           TicketTypeName = blog["TicketTypeName"]  as? String,
                   Amount = blog["Amount"]  as? Int {
        self.koltuklaridler.append("\(SeatDesignId)*\(TicketTypeId)*\(TicketTypeName)*\(Amount)*")        
      }
    }
}

编辑:我根据 JSON 将转换更新为实际类型

现在将两个数组都声明为空字符串数组。

var koltuklar = [String]()
var koltuklaridler = [String]()

并删除第一行中的可选绑定

let myStrings = koltuklar[indexPath.row]
print("\(myStrings)")
...

顺便说一句:您用星号“序列化”字符串并在表格视图中对其进行反序列化的方式非常非常笨拙且效率低下。为数据记录使用自定义类或结构。

【讨论】:

  • 我更改了代码中的代码,但 tableview 没有显示任何项目
  • 我刚刚编辑了答案,因为根据 JSON,有些类型是数字 (Int) 而不是 String
  • 现在来了,但有问题 1:koltuklaridler 不附加任何项目输出 [""] 也不搜索 if let index = koltuklaridler.indexOf(myStringArrf[1]) { in array
  • same print(self.koltuklaridler) 给出输出 [""] 也 print("myStringdetaysecilen (myStringdetaysecilen)") 什么都没有
  • 我试图将我的代码转换为结构,稍后我会更新我的问题,我想你会很容易解决它。
【解决方案2】:

您的问题是您正在从没有 if let 语句的 dict 值创建字符串,因此它返回一个可选值:

对于 json 中的名称为! [任何对象] {

        if let SeatName = name["SeatName"],
           let SeatDesignId = name["SeatDesignId"] {
            self.koltuklar.append("\(SeatName)*\(SeatDesignId)*")
        }

        if let blogs = json["SeatDetail"] as? [[String: AnyObject]] {
            for blog in blogs {

                if let TicketTypeId = blog["TicketTypeId"],
                   let TicketTypeName = blog["TicketTypeName"],
                   let Amount = blog["Amount"] {
                   self.koltuklaridler.append("\(SeatDesignId)*\(TicketTypeId)*\(TicketTypeName)*\(Amount)*")
                }
            }

        }

【讨论】:

  • @user3441052 我更新了答案,我没有测试代码所以如果你有问题请告诉我
  • 同样的家伙!不要修复
  • @user3441052 如果你打印self.koltuklaridler 你有带有可选值的字符串吗?
  • self.koltuklaridler 给出输出[""]
  • 我也添加了我的 json comming 问题
【解决方案3】:

有两种操作方式可选。

  1. 使用“!”展开但如果 value 为 nil,则有可能发生崩溃。
  2. 使用“if let”条件使用术语调用“可选绑定”展开。
if let var = "assigned your optional variable"{
print(var)
}

您将获得没有可选的变量。

【讨论】:

  • 你的回答不能解决我的问题
  • 使用 "SeatName!" 或者如果 let newVar = seatName{ //在新变量中你会发现没有 Optional }.. 希望它会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-18
  • 1970-01-01
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多