Ios 使用Swift将对象添加到阵列而不重复
我仍然对Swift很熟悉,目前在向数组添加对象方面遇到了麻烦。 此外,数组不应该有重复项 到目前为止我所拥有的- 当用户在原型单元上单击按钮时调用的函数。 我正在努力实现-Ios 使用Swift将对象添加到阵列而不重复,ios,arrays,swift,Ios,Arrays,Swift,我仍然对Swift很熟悉,目前在向数组添加对象方面遇到了麻烦。 此外,数组不应该有重复项 到目前为止我所拥有的- 当用户在原型单元上单击按钮时调用的函数。 我正在努力实现- 选择按钮(并用复选标记指示他选择/取消选择了项目) 对于每个所选项目,我有两个值-bool statusisActive和所选项目的subscriptionID 当用户选择项目时,我需要将此选择添加为对象,并进一步将其附加到数组中 为此,我有subscriptionUpdateData:NSDictionary和我的新空数组
isActive
和所选项目的subscriptionID
subscriptionUpdateData:NSDictionary
和我的新空数组subscriptionArray:[NSDictionary]=[]
func subscriptionCell(cell: SubscriptionCell, didToggleSubscription subscription: Subscriptions) {
var subscriptionsArray: [NSDictionary] = []
var subscriptionUpdateData: NSDictionary = ["subscriptionID": 0, "isActive": false]
if let matchingSubscription = subscriptionInformation?.filter({ $0.subscriptionID == subscription.subscriptionID }).first {
matchingSubscription.isActive = !(matchingSubscription.isActive!)
let subscriptionStatus = matchingSubscription.isActive
let subscriptionStatusForId = matchingSubscription.subscriptionID
subscriptionUpdateData = ["subscriptionID": subscriptionStatusForId!, "isActive": subscriptionStatus!]
tableView.reloadData()
}
subscriptionsArray.append(subscriptionUpdateData)
print("\(subscriptionsArray)")
}
上面是怎么回事-
我可以选择一个项目,将其形成字典,并将其添加到我的数组中。:-)
但是,每当我在项目列表中选择其他项目时,它都会用新选择的项目替换数组中的现有元素:-(
我正在寻找下面这样的东西(没有重复项),它是REST端点的输入-
[{ "subscriptionID" : 1234,
"isActive" : true
},
{
"subscriptionID" : 5678,
"isActive" : false
},
{
"subscriptionID" : 3489,
"isActive" : true
}]
是否有人可以查看我遗漏了什么?或者是否有更好的方法可以做到这一点?您必须声明subscriptionsArray为全局变量,请尝试以下代码:
var subscriptionsArray: [NSDictionary] = []
func subscriptionCell(cell: SubscriptionCell, didToggleSubscription subscription: Subscriptions) {
var subscriptionUpdateData: NSDictionary = ["subscriptionID": 0, "isActive": false]
if let matchingSubscription = subscriptionInformation?.filter({ $0.subscriptionID == subscription.subscriptionID }).first {
matchingSubscription.isActive = !(matchingSubscription.isActive!)
let subscriptionStatus = matchingSubscription.isActive
let subscriptionStatusForId = matchingSubscription.subscriptionID
subscriptionUpdateData = ["subscriptionID": subscriptionStatusForId!, "isActive": subscriptionStatus!]
tableView.reloadData()
}
subscriptionsArray.append(subscriptionUpdateData)
print("\(subscriptionsArray)")
}
您可以使用swift字典将这些唯一订阅的ID用作密钥来存储它们:
id1: status1
id2: status2
...
代码示例:
var statusesDict = [Int: Bool?]()
func subscriptionToggled(subscription: Subscription) {
if let matchingSubscription = subscriptionInformation?.filter({ $0.subscriptionID == subscription.subscriptionID }).first {
let status = matchingSubscription.isActive
let id = matchingSubscription.subscriptionID
statusesDict[id] = status
}
//if you're using the same object from dataSource array, you dont need to look for it by filtering, just use the parameter object
}
现在,当您需要将结果发送到服务器时,只需从字典中创建一个数组:
func getSubscriptionsArray() -> [[String: Any]] {
var result = [Dictionary<String, Any>]()
for (id, status) in statusesDict.enumerated() {
let subscriptionDict: [String: Any] = [
"subscriptionID" : id,
"isActive" : status
]
result.append(subscriptionDict)
}
print("\(result)")
return result
}
对于打印精美的json:
将您的
var subscriptionArray:[NSDictionary]=[]
subscriptionCell方法可能在实例级别之外最简单的方法是使用谓词并过滤数组以删除重复项。为什么要混合使用Swift集合类型和Cocoa集合类型?只使用Swift集合类型。换句话说,不要使用NSDictionary
。添加isActive
pro与您的数据源模型相关。额外的数组相当麻烦。要更熟悉Swift,请摆脱NSDictionary
,使用本机SwiftDictionary
,或者更好的是使用自定义类或结构。签出Set API以帮助您从集合中删除重复的元素。谢谢!它可以工作。但是我该如何获取消除重复?为了避免重复,您应该使用集合而不是数组。如果顺序很重要,那么还有一个NSOrderedSet。您可以使用NSDictionary:var subscriptions:NSDictionary=[Int:Bool]=[:]并按代码添加数据:subscriptions[subscriptionStatusForId]=subscriptionstatus这不是一个全局变量;它是一个实例变量(或者,用Swift术语来说,是一个属性)。顺便说一句,没有人再使用字典
风格的声明字典了。只需使用[Key:Value]
@alexburtnik:Got!但是在subscriptionDict中,它应该是status.0表示“subscriptionID”,status.1表示“isActive”由于id是statusesDict.enumerated()中的索引,但最终结果是[[“isActive”:0,“subscriptionID”:1241],“isActive”:1,“subscriptionID”:1237]],但我正在寻找像[{“isActive”:0,“subscriptionID”:1241},{“isActive”:1,“subscriptionID”:1237}]这样的对象数组@LohithKorupolu您应该先将其序列化为json,不要直接发送字典。@alexburtnik:简单的逻辑丢失了!非常感谢!!我的大脑应该整理一次碎片:-|
let jsonData = try JSONSerialization.data(withJSONObject: array, options: [])
let string = String(data: jsonData, encoding: String.Encoding.utf8)
let jsonData = try JSONSerialization.data(withJSONObject: array, options: JSONSerialization.WritingOptions.prettyPrinted)
let string = String(data: jsonData, encoding: String.Encoding.utf8)