2017-02-14 9 views
0

私はビューで線を描画しようとしましたが、オプションの型エラーのためにコードがコンパイラに失敗しました。私は迅速かつ客観的に新しいと答えを検索するために多くの時間を費やしています。これまで問題は解決していません。だから、誰かがこの問題を解決する手がかりを提供することはできますか?オプションタイプの値 "CGContext?"アンラップされていません

コード:

import UIKit 

class DrawLines: UIView { 

     // Only override draw() if you perform custom drawing. 
    // An empty implementation adversely affects performance during animation. 
    override func draw(_ rect: CGRect) { 
     //Drawing code 
     // context 
     let context = UIGraphicsGetCurrentContext() 
     CGContextSetLineWidth(context, 3.0) 
     CGContextSetStrokeColorWithColor(context, UIColor.purpleColor().cgColor) 

     //create a path 
     CGContextMoveToPoint(context,0,0) 
     CGContextAddLineToPoint(context,250,320) 

    } 
} 

エラー:

enter image description here

+1

** Fix-it **オプションをクリックするだけで簡単に使用できます。 –

+0

@NiravDお返事ありがとうございます。それはあなたの提案によって問題を解決するかもしれませんが、私の問題は解決しません。この問題の原因を教えてください。 – pipi

+0

それは私の問題を解決しないという意味ですか、修正後、現在取得しているエラーが削除されます。 –

答えて

1

コンテキストをアンラップするだけで、100%安全ですが、問題は1つしか解決しません。

UIGraphicsGetCurrentContextのドキュメントから:

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を::

The current graphics context is nil by default. Prior to calling its drawRect: method, view objects push a valid context onto the stack, making it current.

スウィフト3(draw署名から推定)で、グラフィックス構文が大幅に変更しかし、あなたはコメントを外す必要がある線を描画しますbeginPath()およびstrokePath()行。

+0

削除します!追加する代わりにUIGraphicsGetCurrentContextの最後から?文脈の最後に、プログラムを遵守して実行することができます。このようにすれば、違いはありますか? – pipi

+0

末尾の感嘆符が必ずしも悪くない、または安全でないとは限りません。ドキュメントによると、感嘆符を付けることは絶対に安全です。疑問符はオプションです。 – vadian

2

UIGraphicsGetCurrentContext()あなたがcontext!を呼び出す必要がありますあなたの例では、それを使用するために、オプションを返します。それがあれば、聞かせて、それを包むそれを使用する 最善の方法:

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

またはより良い使用ガードしてみましょう:

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

'UIView'を使用しているときにコンテキストが存在することが保証されています – vadian

2

この場合、解決策は、コンテキストを取得するとき!を使用することです:

let context = UIGraphicsGetCurrentContext()! 

非常に間違っていることを意味する現在のコンテキストがない場合、アプリケーションがクラッシュします。

関連する問題