【问题标题】:How should I be creating a variable that depends on another in Swift?我应该如何在 Swift 中创建一个依赖于另一个变量的变量?
【发布时间】:2014-06-10 03:51:23
【问题描述】:

我有一个cellForItemAtIndexPath 方法用于我的UICollectionView。重用标识符取决于 indexPath,所以我打算这样做:

var reuseIdentifier: String

if indexPath.row == 0 {
    reuseIdentifier = "One"
} else if indexPath.row == 1 {
    reuseIdentifier = "Two"
} else if indexPath.row == 2 {
    reuseIdentifier = "Three"
}

var cell: UICollectionViewCell = collectionView.dequeueReusableCellWithIdentifier(reuseIdentifier, indexPath:indexPath)

这是正确的吗? reuseIdentifier 应该是可选字符串,还是普通字符串就可以了?

此外,在nil 的情况下,我是否正确处理了它?如果不是 2,reuseIdentifier 是 nothing,对吗? (这与 nil 不同?)我应该清楚地处理这个问题,对吧?

【问题讨论】:

    标签: ios cocoa-touch swift


    【解决方案1】:

    为什么不做一些更简单的事情,比如这样?

    let reuseIdentifier = ["One", "Two", "Three"][indexPath.row]
    

    注意:如果indexPath.row > 2,这将崩溃。如果可能发生这种情况,那么您应该更加小心。您可能会考虑这样的事情:

    extension Array {
        func at(index: Int) -> T? {
            if index >= count {
                return nil
            } else {
                return self[index]
            }
        }
    }
    
    // ...
    
    let reuseIdentifier: String? = ["One", "Two", "Three"].at(indexPath.row) // might be nil
    

    【讨论】:

    • 那...真的很酷。但是,如果我有一个更复杂的结构,而我不能在一行中完成呢?常量是否如此有限,以至于它们需要在声明它们的同一行进行初始化?
    • @DougSmith 好吧,如果你愿意,你绝对可以使用var,但常量通常更安全、更清晰。 (Swift 指南说,“如果代码中的存储值不会改变,请始终使用 let 关键字将其声明为常量。仅使用变量来存储需要能够更改的值。”)如果你有更复杂的逻辑,或许可以封装在辅助函数中?
    【解决方案2】:

    如果你声明了一个非可选类型的var 并且从不分配给它,这是一个编译时错误。

    如果你想让它为 nil,你需要将它声明为可选项。然后你需要适当地处理它为 nil 的情况——因为表格将接受一个 nil 单元格,你可以这样做。

    【讨论】:

    • 所以在这种情况下它应该是可选的,因为在极少数情况下它可能不会被设置?那么哪个会使其为零?如果我将 nil String 对象作为参数传递会发生什么?
    猜你喜欢
    • 1970-01-01
    • 2015-03-19
    • 2019-11-29
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 2015-08-02
    相关资源
    最近更新 更多