gpt4 book ai didi

swift - 如何定义一个空的 "uninitialized"键路径并稍后设置?

转载 作者:行者123 更新时间:2023-12-04 12:19:08 25 4
gpt4 key购买 nike

我做了一个程序来计算 View 的总宽度/高度(有时我想要总宽度,有时我想要总高度)。唯一的问题是:如果我正在计算宽度,我想添加一个额外的 10到总数。这是我当前的代码:

func calculateLengthOfAllViews(calculatingWidth: Bool) {
let views = [
UIView(frame: CGRect.zero),
UIView(frame: CGRect(x: 0, y: 0, width: 50, height: 50)),
UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 50))
]

var totalLength: CGFloat = 0

if calculatingWidth {
totalLength += 10 /// add extra 10 if calculating width
} else {
totalLength += 0
}

for view in views { /// add each view's width/height
let length: CGFloat
if calculatingWidth {
length = view.frame.width
} else {
length = view.frame.height
}
totalLength += length
}

print("Total length is \(totalLength)")
}

calculateLengthOfAllViews(calculatingWidth: true) /// Total length is 160.0
calculateLengthOfAllViews(calculatingWidth: false) /// Total length is 100.0
这工作正常。但是,我要重复 if calculatingWidth {在 2 个地方,确定:
  • 是否添加额外的padding 10 padding
  • 是否使用view.frame.widthview.frame.height作为长度

  • 第二个 if 语句是不必要的,因为它在每次迭代中总是评估为相同的东西。
    所以,我认为 keypaths是要走的路——我可以存储对 .width 的引用或 .height从第一个 if 语句开始。但是,如何在不“初始化”的情况下定义键路径?我想做这样的事情:
    let keyPath: KeyPath /// Reference to generic type 'KeyPath' requires arguments in <...>

    if calculatingWidth {
    totalLength += 10
    keyPath = \UIView.frame.width
    } else {
    totalLength += 0
    keyPath = \UIView.frame.height
    }

    for view in views {
    let length = view[keyPath: keyPath] /// Type of expression is ambiguous without more context
    totalLength += length
    }
    但是,这给了我 Reference to generic type 'KeyPath' requires arguments in <...> .我怎样才能解决这个问题?

    最佳答案

    class KeyPath<Root, Value>
    是具有两个类型参数的泛型类型:根类型和结果值类型,必须在变量声明中指定。在你的情况下,这将是
    let keyPath: KeyPath<UIView, CGFloat>
    有了这个定义,剩下的代码也会编译。

    关于swift - 如何定义一个空的 "uninitialized"键路径并稍后设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68795087/

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