gpt4 book ai didi

ios - 为什么 NSLayoutConstraint 是可选类型?

转载 作者:行者123 更新时间:2023-11-28 12:18:02 27 4
gpt4 key购买 nike

通常我会避免在 stackoverflow 上提出新问题,因为 90% 的问题都可以通过搜索轻松解决。但有时你不能这样做。

我有几个对象 class GameTimer : UIView我添加到数组中 var timersArray: [GameTimer?] { get set }我的 View Controller 动态。我已经实现了一些小类来处理该对象的约束。每次添加新对象时,我也会添加纵向和横向模式的约束。

class ConstraintsContainer {

var portraitConstraints: [NSLayoutConstraint] = []
var landscapeConstraints: [NSLayoutConstraint] = []

func setGeneralConstraints(timerView: GameTimer?, timerViewSize: CGFloat) {
timerView?.translatesAutoresizingMaskIntoConstraints = false
timerView?.heightAnchor.constraint(equalToConstant: timerViewSize).isActive = true
timerView?.widthAnchor.constraint(equalToConstant: timerViewSize).isActive = true
print("General constraints")
}

func getDeviceOrientation() {

if UIDevice.current.orientation == UIDeviceOrientation.portrait || UIDevice.current.orientation == UIDeviceOrientation.portraitUpsideDown {
NSLayoutConstraint.activate(portraitConstraints)
} else {
NSLayoutConstraint.activate(landscapeConstraints)
}
}
}

当我尝试在我的 View Controller 中使用这个类时

var constraintsContainer = ConstraintsContainer()

并为实例设置一些值

constraintsContainer.portraitConstraints = [
timersArray[0]?.topAnchor.constraint(equalTo: view.topAnchor, constant: view.frame.height/4.5),
(timersArray[0]?.centerXAnchor.constraint(equalTo: view.centerXAnchor))
]

constraintsContainer.landscapeConstraints = [
(timersArray[0]?.topAnchor.constraint(equalTo: view.topAnchor, constant: view.frame.height/6.5)),
(timersArray[0]?.centerXAnchor.constraint(equalTo: view.centerXAnchor))
]

我收到来自 XCode 的错误警告,告诉我 “可选类型 'NSLayoutConstraint 的值?'未展开” 并建议我像这样展开每个约束 (timersArray[0]?.topAnchor.constraint(equalTo: view.topAnchor, constant: view.frame.height/4.5))!

所以,不知道为什么 NSLayoutConstraint考虑到它的引用 class NSLayoutConstraint : NSObject,类型在这里显示为可选.是否有可能避免它成为可选的?原因 - 当我停用特定对象的约束时,然后从 constraintsContainer 中清除约束并删除我的 GameTimer 的对象来自 timersArray 的类类型并实现了这个解包我发现了一个错误 -

Thread 1:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

 func deactivate() {

NSLayoutConstraint.deactivate(constraintsContainer.portraitConstraints)
NSLayoutConstraint.deactivate(constraintsContainer.landscapeConstraints)
constraintsContainer.portraitConstraints.removeAll()
constraintsContainer.landscapeConstraints.removeAll()
}

为什么 NSLayoutConstraint 在我的特定情况下似乎是可选的?

最佳答案

查询、调用可能为“nil”的可选属性、下标和方法的过程被定义为可选链接。可选链接返回两个值 -

if the optional contains a 'value' then calling its related property, methods and subscripts returns values.

if the optional contains a 'nil' value all its its related property, methods and subscripts returns nil.

由于对方法、属性和下标的多个查询被组合在一起,一个链的失败将影响整个链并导致“零”值。

并且您的 timersArray 是可选的?

关于ios - 为什么 NSLayoutConstraint 是可选类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45775723/

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