Swift - 在将项添加到数组时展开“可选”值时意外地发现了nil

时间:2016-07-21 15:56:01

标签: ios arrays swift

我有一个像这样的数组:

var gestureArray: Array<UIGestureRecognizer>!

我试图像这样添加项目到这个数组:

for gesture in webview.scrollView.gestureRecognizers!
        {
            gestureArray.insert(gesture, atIndex: 0)
        }

        print(gestureArray)

但尝试添加第一项后我收到此错误:

unexpectedly found nil while unwrapping an Optional value

当我打印每个手势时,它们看起来像这样:

<UIScrollViewDelayedTouchesBeganGestureRecognizer: 0x124eabb60; state = Possible; delaysTouchesBegan = YES; view = <_UIWebViewScrollView 0x125825400>; target= <(action=delayed:, target=<_UIWebViewScrollView 0x125825400>)>>

<UIScrollViewPanGestureRecognizer: 0x124eac370; state = Possible; delaysTouchesEnded = NO; view = <_UIWebViewScrollView 0x125825400>; target= <(action=handlePan:, target=<_UIWebViewScrollView 0x125825400>)>>

<UIScrollViewPinchGestureRecognizer: 0x124d892a0; state = Possible; delaysTouchesEnded = NO; view = <_UIWebViewScrollView 0x125825400>; target= <(action=handlePinch:, target=<_UIWebViewScrollView 0x125825400>)>>

2 个答案:

答案 0 :(得分:3)

这意味着数组尚未初始化为非零值。

当你在一个类型后面加上感叹号!时,你会告诉Swift两件事:

  • gestureArray的值nil
  • 完全合法
  • 您将在访问之前为gestureArray分配一个非零值。

作为回报,Swift允许您访问gestureArray,就像它不是可选的一样(即使用gestureArray.insert(...)代替gestureArray!.insert(...)

从您收到的例外情况来看,gestureArray在您呼叫nil时仍然是insert

答案 1 :(得分:2)

您的gestureArray值为零。您可以这样创建变量:

var gestureArray = [UIGestureRecognizer]()

您正在创建变量并设置其类型,但从未分配其值。还有另一个错误,您无法创建类属性并将其设置为unwrapped optional。您应该始终或创建变量并为其赋值,或将其类型设置为optional。例如:var gestureArray: [UIGestureRecognizer]?