Swift:如何将数据添加到对象列表中对象的变量中

标签 swift list class object

我从需要存储的 xml 中获取了 3 层数据

1:开始时间和结束时间

2:主机的IP和MAC地址

3:各主机IP的端口号和服务

我用来解决这个问题的方法是创建 3 个类,并让每个类都有数据变量,如下所示:

class Ports {
var scanPortNumber: [String] = [""]
var scanProtocol: [String] = [""]
}

class Hosts {
    var hostPorts = [Ports]()
    var scanHostIP: [String] = [""]
    var scanHostMacAddr: [String] = [""]
}

class Scan {
    var scanHosts = [Hosts]()
    var scanStartTime: [String] = [""]
    var scanEndTime: [String] = [""]
}

然后我声明了一个全局对象,我在其中解析 xml,如下所示:

var scanDetails = Scan()

这样我就可以像这样存储从 xml 获得的 IP:

scanDetails.scanHosts[i].scanHostIP[i] = "the IP I get from parsing the xml"

这是我尝试存储数据的方式:

var scanDetails = Scan()

class XMLRead: NSObject, XMLParserDelegate {
    var hostIP = ""
    var hostMacAddr = ""
    
    func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
        
        var i = 0
        
        if !elementName.isEmpty {
            
            switch elementName {
                
                case "address":
                    print("i in address = \(i)")
                    let addrType = attributeDict["addrtype"]
                    if addrType == "ipv4" {
                        let hostIPtmp = attributeDict["addr"]
                        if hostIPtmp != hostIP || hostIP == "" {
                            hostIP = hostIPtmp!
                            scanDetails.scanHosts[i].scanHostIP[i] = hostIP
                        }
                    }
                    else if addrType == "mac" {
                        let hostMacAddrtmp = attributeDict["addr"]
                        if hostMacAddrtmp != hostMacAddr || hostMacAddr == "" {
                            hostMacAddr = hostMacAddrtmp!
                            scanDetails.scanHosts[i].scanHostMacAddr[i] = hostMacAddr
                        }
                    }
                    print("hostIP = \(scanDetails.scanHosts[i].scanHostIP[i])")
                    print("hostMacAddr = \(scanDetails.scanHosts[i].scanHostMacAddr[i])")
                
                default:    break
            }
            
            i += 1
            print("i = \(i)")
        }
    }

    func parser(_ parser: XMLParser, parseErrorOccurred parseError: Error) {
        print("failure error: \(parseError)")
    }
} 

但是这个方法似乎不起作用,因为当我这样做时它给了我**索引超出范围错误**。所以我尝试使用 append() 方法,但它说我必须附加一个 Hosts 类型,并且不允许我附加从 xml 获取的值,因为它是一个字符串。

我对 swift 还很陌生,所以如果有人能告诉我我做错了什么以及如何解决它,我将不胜感激。

最佳答案

只需运行您提供的代码: 我将进行以下更改:

.
.
var i = 0
var host: Hosts?
.
.
if hostIPtmp != hostIP || hostIP == "" {

   hostIP = hostIPtmp!
   host = Hosts()
   host!.scanHostIP.append(hostIP)
                        
   scanDetails.scanHosts.append(host!)
}
.
.
.
if hostMacAddrtmp != hostMacAddr || hostMacAddr == "" {
   hostMacAddr = hostMacAddrtmp!

   if host == nil {
      host = Hosts()
   }
   host!.scanHostMacAddr.append(hostMacAddr)
   scanDetails.scanHosts.append(host!)
}
.
.

但我不明白,如果您只想在每个类中放入一个值,为什么要使用“i”和类的变量作为数组。

关于Swift:如何将数据添加到对象列表中对象的变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65991782/

相关文章:

ALAMOFIRE 的 JSON_encode

python - 将值连接到列表中到 python 中的键

java - 如何制作包含列表的java hashmap?

swift - CLBeacon 接近度始终仅返回 .near 和 .far 值,但不返回 .immediate

ios - SpriteKit 中的分享按钮崩溃了?

ios - 两个物体之间的碰撞

python - 检查列表是否有重复列表

swift - 类类型属性不应该有 static 关键字吗?

java - 构造函数中带有 super 的 UML 类图

java - 在类中使用构造函数中的变量/数组