gpt4 book ai didi

ios - 为什么 UICollectionViewUpdateItem indexPathBeforeUpdate(类型为 NSIndexPath?)需要两个 ! 来解包

转载 作者:行者123 更新时间:2023-11-28 09:08:37 25 4
gpt4 key购买 nike

UICollectionViewLayout 包含一个函数 prepareForCollectionViewUpdates

func prepareForCollectionViewUpdates(_ updateItems: [AnyObject]!) // updateItems is an array of UICollectionViewUpdateItem

UICollectionViewUpdateItem 包含属性 indexPathBeforeUpdate

var indexPathBeforeUpdate: NSIndexPath? { get }

我正在查看 CollectionViewLayout 类的一些代码,该类是 UICollectionViewFlowLayout 的子类,Xcode 需要两个 ! 来解包indexPathBeforeUpdate(这是一个 getter 返回 NSIndexPath? 的属性)。看起来这只需要一个 ! 来解包。相关代码:

class CollectionViewLayout: UICollectionViewFlowLayout {

var insertIndexPaths = NSMutableArray()
var deleteIndexPaths = NSMutableArray()

override func prepareForCollectionViewUpdates(updateItems: [AnyObject]!) {
super.prepareForCollectionViewUpdates(updateItems)

deleteIndexPaths.removeAllObjects()
insertIndexPaths.removeAllObjects()

for update in updateItems {
if update.updateAction == UICollectionUpdateAction.Delete {
deleteIndexPaths.addObject(update.indexPathBeforeUpdate!!) // <- I have a question here
} else if update.updateAction == UICollectionUpdateAction.Insert {
insertIndexPaths.addObject(update.indexPathAfterUpdate!!)
}
}
...
}
}

如果我只用一个!打开 update.indexPathBeforeUpdate

 deleteIndexPaths.addObject(update.indexPathBeforeUpdate!)

我得到错误:

Value of optional type 'NSINdexPath?' not unwrapped; did you mean to use '!' or '?'?" 

我得到了“插入 ! 和两个 ! 解包更新的修复建议。indexPathBeforeUpdate,代码运行正常.

为了调查,我在 for 循环中插入了一些变量:

for update in updateItems {
var myUpdate = update // option-click shows myUpdate is an AnyObject
var indexPath1 = update.indexPathBeforeUpdate // option-click shows indexPath1 is an NSIndexPath?!
var indexPath2 = update.indexPathBeforeUpdate! // option-click shows indexPath2 is an NSIndexPath?
var indexPath3 = update.indexPathBeforeUpdate!! // option-click shows indexPath3 is an NSIndexPath
...
}

按住 Option 并单击变量会在上面的注释中显示每个变量的类型。

UICollectionViewUpdateItem 的文档显示 indexPathBeforeUpdate 时,为什么 Xcode 需要两个 ! 来解包 update.indexPathBeforeUpdate > 成为可选的 NSIndexPath (NSIndexPath?)?

最佳答案

请注意,当您在 for-in 循环属性中为 update 拉起自动完成时,它如何返回一个 Optional?那是因为您正在使用 [AnyObject] 数组。 Swift 无法保证该对象将具有您要求的属性,因此它将它包装在一个 Optional 中。

如果您转换该数组,则不会出现双重展开问题(或者至少您已将第一个力展开移动到转换中)。

for update in updateItems as! [UICollectionViewUpdateItem] {
if update.updateAction == UICollectionUpdateAction.Delete {
deleteIndexPaths.addObject(update.indexPathBeforeUpdate!)
} else if update.updateAction == UICollectionUpdateAction.Insert {
insertIndexPaths.addObject(update.indexPathAfterUpdate!)
}
}

我猜 Apple 还没有时间审核这个 API。将来我希望方法签名更改为:

override func prepareForCollectionViewUpdates(updateItems: [UICollectionViewUpdateItem])

这将使这不是问题。现在,这只是我们必须处理的事情。

关于ios - 为什么 UICollectionViewUpdateItem indexPathBeforeUpdate(类型为 NSIndexPath?)需要两个 ! 来解包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30132588/

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