可选类型“CGContext?”的值没有打开

时间:2017-02-14 12:26:27

标签: swift swift3 cgcontext

我尝试在视图中绘制一条线,但由于可选的类型错误,我的代码无法编译。我是一个快速和客观的新手,并花了很多时间来搜索答案。到目前为止,这个问题没有解决。那么,任何人都可以提供一些线索来解决这个问题吗?

代码:

type Chart struct {
    ID          int             `json:"id,omitempty" db:"id"`
    Name        string          `json:"name,omitempty" db:"name"`
    Type        string          `json:"type,omitempty" db:"type"`
    DashboardID int             `json:"dashboard_id,omitempty"`
    SourceType  string          `json:"source_type,omitempty" db:"source_type"`
    Data        json.RawMessage `json:"graph_data,ommitempty"`
}

func main() {
    chart := Chart{}
    chart.ID = 1
    chart.Name = "Jishnu"
    str, err := json.Marshal(chart)
    fmt.Println(err)
}

错误:

enter image description here

3 个答案:

答案 0 :(得分:2)

UIGraphicsGetCurrentContext()返回可选项,要在您的示例中使用它,您需要调用context!。 使用它的最佳方式是将它包装在if-let中:

if let context = UIGraphicsGetCurrentContext() {
    // Use context here
}

甚至更好地使用后卫:

guard let context = UIGraphicsGetCurrentContext() else { return }
// Use context here

答案 1 :(得分:2)

在这种情况下,解决方案是在获取上下文时使用!

let context = UIGraphicsGetCurrentContext()!

当没有当前上下文时,应用程序将崩溃,这意味着您已经做了一些非常错误的事情。

答案 2 :(得分:2)

只是强行解开上下文,它是100%安全但只能解决一个问题。

来自UIGraphicsGetCurrentContext的文档:

  

默认情况下,当前图形上下文为nil在调用其drawRect:方法之前,视图对象会将有效的上下文推送到堆栈,使其成为当前

在Swift 3中(假设来自draw签名),图形语法发生了显着变化:

class DrawLines: UIView {

    override func draw(_ rect: CGRect) {
        let context = UIGraphicsGetCurrentContext()!
        context.setLineWidth(3.0)
        context.setStrokeColor(UIColor.purple.cgColor)

        //create a path

        // context.beginPath()
        context.move(to: CGPoint())
        context.addLine(to: CGPoint(x:250, y:320))
        // context.strokePath()

    }
}

PS:但要绘制线条,您应取消注释beginPath()strokePath()行。