不确定如何为现有代码正确设置我的变量。致命错误:在隐式展开可选值时意外发现 nil
Posted
技术标签:
【中文标题】不确定如何为现有代码正确设置我的变量。致命错误:在隐式展开可选值时意外发现 nil【英文标题】:Not sure how to set my variables correctly for existing code. Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value 【发布时间】:2020-02-06 17:41:02 【问题描述】:我目前正在尝试从 viewcontrollers viewdidload() 中的单独类运行一个函数。以前的开发人员团队编写了代码,我正在努力让它工作,因为我对 swift 也很陌生。
我没有包含所有函数,因为它很长,但我只是想知道是否可以得到一些建议,我收到错误“致命错误:意外发现 nil,同时隐式展开可选值”对于 shapelayer 值,我'我知道这是因为它们尚未初始化,但我正在努力弄清楚如何正确设置变量而不会弄乱整个代码,只是希望得到一些指导。
我确定我可能需要解释更多,但是代码很多,我整天都在盯着它,如果我需要更多上传,请告诉我。
class TraceViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate
@IBOutlet weak var canvasView: CanvasView!
static var curLetter = "A"
override func viewDidLoad()
canvasView.letter = TraceViewController.curLetter
canvasView.clearCanvas()
类:
class CanvasView:UIView
var lineColour:UIColor!
var lineWidth:CGFloat!
var path:UIBezierPath!
var touchPoint:CGPoint!
var startingPoint:CGPoint!
var initialPoint:CGPoint!
var stroke1Done = false
var stroke2Done = false
var stroke3Done = false
var stroke4Done = false
var stroke5Done = false
var stroke6Done = false
var stroke7Done = false
//Track current stroke and add all the shape layers into an array
var currentStroke = 1
var strokesArray = [CAShapeLayer]()
func drawShapeLayer()
let shapeLayer = CAShapeLayer()
shapeLayer.path = path.cgPath //error here
shapeLayer.strokeColor = lineColour.cgColor
shapeLayer.lineWidth = lineWidth
shapeLayer.fillColor = UIColor.clear.cgColor
self.layer.addSublayer(shapeLayer)
//Add the shapes in array so that we can track it
self.strokesArray.append(shapeLayer)
self.setNeedsLayout()
func clearCanvas()
guard path != nil else return
path.removeAllPoints()
self.layer.sublayers = nil
self.setNeedsDisplay()
print("Hello")
stroke1Done = false
stroke2Done = false
stroke3Done = false
stroke4Done = false
stroke5Done = false
stroke6Done = false
stroke7Done = false
goNext = false
updateStrokePoints()
updateStrokeDifference()
currentStroke = 1
【问题讨论】:
您在哪一行收到致命错误? 您好,我刚刚评论了错误发生的位置。它发生在 shapeLayer.path 中,如果注释掉该变量,它会发生在每个 shapeLayer 属性中。 您声明了var path:UIBezierPath!
,但您尚未创建它。
【参考方案1】:
该错误似乎是因为您在使用之前没有设置路径。您需要在实际调用之前设置path
。
第一:
var path: UIBezierPath?
然后:
path = UIBezierPath()
最后,使用它:
shapeLayer.path = path?.cgPath
另外,请记住使用?
而不是!
,强制展开总是不好的做法。
【讨论】:
嘿,伙计,我已经尝试过了,并在每个变量的末尾添加了选项,当它们出现错误时,但我现在在我的代码中也充满了新的错误。我能联系你看一下我的代码吗,这门课很长。我整天都在努力让它运行:( 根据需要声明变量并非总是不好的做法(请注意,IBOutlets 是这样做的)。 @Slacky88,您需要做的是跟踪对drawShapeLayer()
的调用,并在代码中查找 创建路径的位置,并找出为什么在该点之前调用 drawShapeLayer()
。 以上是关于不确定如何为现有代码正确设置我的变量。致命错误:在隐式展开可选值时意外发现 nil的主要内容,如果未能解决你的问题,请参考以下文章