gpt4 book ai didi

ios - Swift:作为参数传递的字典始终为空

转载 作者:行者123 更新时间:2023-11-29 00:54:36 25 4
gpt4 key购买 nike

我想通过一种方法来填充字典,其中字典是参数之一。当我向键添加一个值时,比如 15,当我第二次尝试使用相同的键(即 15)访问它时,它总是返回 0 计数。这是代码。


private static var showWidgetMap = Dictionary<Int, [BaseWidget]>()
private static var hideWidgetMap = Dictionary<Int, [BaseWidget]>()

static func initHandler()
{
let cloudWidget = CloudWidget()
cloudWidget.setType(CreatorConstants.CLOUD)
let property1 = [CreatorConstants.IMG_SRC: "cloud1", CreatorConstants.X_COORD: "100", CreatorConstants.Y_COORD: "450"]
cloudWidget.setPropery(property1)

addWidgetInLocalTimeList(15, widget: cloudWidget, delete: false)

let emojiWidget = CloudWidget()
emojiWidget.setType(CreatorConstants.EMOTICON)
let property2 = [CreatorConstants.IMG_SRC: "1", CreatorConstants.X_COORD: "100", CreatorConstants.Y_COORD: "550"]
emojiWidget.setPropery(property2)

addWidgetInLocalTimeList(15, widget: emojiWidget, delete: false)}


static func addWidgetInLocalTimeList(time_milisec: Int, widget: BaseWidget, delete: Bool)
{
if(delete)
{
checkAndAdd(hideWidgetMap, key: time_milisec, widget: widget);
}
else
{
checkAndAdd(showWidgetMap, key: time_milisec, widget: widget);
}
}

private static func checkAndAdd(var map: Dictionary<Int, [BaseWidget]>, key: Int, widget: BaseWidget)
{
print("map count is")
print(map.count)

if var val = map[key]
{
val.append(widget);
}
else
{
var temp: [BaseWidget] = [];
temp.append(widget);
map[key] = temp
print(map.count)
}
}

print(map.count)总是返回 0。

最佳答案

您需要了解值类型引用类型之间的区别。

值类型变量只是值。例如,数组是一种值类型。它只是“一堆东西”的值*。另一方面,引用类型是对值的引用。例如,当您创建 UIViewController 时,该变量实际上存储对实际 UIviewController * 的引用。

不太明白?接下来就是类比时间了!您创建的变量和常量是子变量。你放入变量和常量中的东西就是气球。

child 有两种类型,一种类型(值类型)喜欢直接把气球拿在手里。另一种类型(引用类型)喜欢使用字符串 ** 来容纳气球。

当您将子对象传递给方法时,根据子对象的类型,会发生不同的事情:

  • 值类型的 child 手里拿着气球,紧紧地握着,方法参数无法将气球从他手中夺走。那它能做什么呢?它创建了它的副本!然后,它将副本复制到方法实现中,让它执行其操作。

  • 但是,引用类型使用字符串保存气球。该方法参数会将另一个字符串绑定(bind)到气球,以便实现可以使用该字符串访问它。因此,不会创建气球的副本。

那么你在这里做错了什么?

由于 swift 字典是值类型,因此当您将字典传递给方法时,正如我上面所说,它会创建一个副本!在实现中,您实际上是在编辑字典的副本,而不是原始字典。这就是为什么原始字典的计数仍然为 0。

你能做什么?

不要用 var 标记参数,顺便说一句,这是一种非常糟糕的做法,而是用 inout 标记它!

private static func checkAndAdd(inout map: Dictionary<Int, [BaseWidget]>, key: Int, widget: BaseWidget)

inout 修饰符基本上表示

Hey parameter, next time you see a value type, just get a string and tie it to the balloon that the child is holding.

还有一件事你应该做。也就是说,您应该更改调用方法的方式。

而不是

checkAndAdd(showWidgetMap, key: time_milisec, widget: widget)

你写

checkAndAdd(&showWidgetMap, key: time_milisec, widget: widget)

神奇的是,它确实有效!

结论: 参数是愚蠢的。它们甚至不够聪明,不知道何时绑定(bind)字符串。 使用值类型时要小心。


脚注 * 假设它不是 nil

** 不是 String 类型,而是实际的字符串。

关于ios - Swift:作为参数传递的字典始终为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37743663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com