2017-01-27 13 views
2

コードはx1とy1変数を格納しますが、touchesEnded関数が開始されると直ぐに元の0.0の値に戻ります。私はtouchesBegan関数が終了した後にこれらの値を残しておきたい。これらの値はどのように保存できますか?グローバルに値を格納する方法は?

var x1: CGFloat = 0.0 
var y1: CGFloat = 0.0 
var x2: CGFloat = 0.0 
var y2: CGFloat = 0.0 

//touch initialized 
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    for touch in touches { 
     let location = touch.location(in: self) 
     var x1 = location.x 
     var y1 = location.y 
     print(x1,y1) 
    } 
} 

//touch ends 
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
    for touch in touches { 
     print(x1,y1) 
     let location2 = touch.location(in: self) 
     let x2 = location2.x 
     let y2 = location2.y 
     let originX = min(x1,x2) 
     let originY = min(y1,y2) 
     let cornerX = max(x1,x2) 
     let cornerY = max(y1,y2) 
     let boxWidth = cornerX - originX 
     let boxHeight = cornerY - originY 

     let box = SKSpriteNode() 
     box.size = CGSize(width: boxWidth, height: boxHeight) 
     box.color = SKColor.black 
     box.position = CGPoint(x:originX, y: originY) 
     addChild(box) 

     print(x1,y1,x2,y2) 
    } 
} 
+2

4つのCGFloatの代わりに2つの可変CGPointsを宣言してみませんか? –

+2

ところで、GLOBALというプロパティを作るつもりはないので質問のタイトルを変えてください。 –

+1

@Leo彼の視点からは、彼はグローバル化しようとしているので、タイトルが立っていると思います。私は、変数がローカル変数、クラス変数またはグローバル変数を持つことができ、実際のグローバル変数ではなくクラスプロパティを必要としていることを認識しているとは思いません。 –

答えて

4

各機能の中でそれらを再宣言しています。それらはその機能にローカルなままです。上で行ったように外側に宣言し、関数内に値を設定します。自己を使う必要はないかもしれませんが、あなたが遊んでいる変数がクロージャの外から来たものであることを知らせるので、良い考えです。

var x1: CGFloat = 0.0 
var y1: CGFloat = 0.0 
var x2: CGFloat = 0.0 
var y2: CGFloat = 0.0 

//touch initialized 
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
for touch in touches{ 
let location = touch.location(in: self) 
self.x1 = location.x 
self.y1 = location.y 
print(x1,y1) 

    } 
} 

//touch ends 
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?){ 
for touch in touches{ 

print(x1,y1) 
let location2 = touch.location(in: self) 
self.x2 = location2.x 
self.y2 = location2.y 
let originX = min(self.x1,self.x2) 
let originY = min(self.y1,self.y2) 
let cornerX = max(self.x1,self.x2) 
let cornerY = max(self.y1,self.y2) 
let boxWidth = cornerX - originX 
let boxHeight = cornerY - originY 

let box = SKSpriteNode() 
box.size = CGSize(width: boxWidth, height: boxHeight) 
box.color = SKColor.black 
box.position = CGPoint(x:originX, y: originY) 
addChild(box) 

print(self.x1,self.y1,self.x2,self.y2) 
1

関数内にはvarを付けないように変更します。 varを使用すると、クラス/グローバル変数を非表示にするローカル変数を作成します。

//touch initialized 
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 

    for touch in touches{ 
    let location = touch.location(in: self) 
    x1 = location.x 
    y1 = location.y 
    print(x1,y1) 

    } 
} 
1

これは数回も私を引きつけました。

スウィフト3黙って(でも警告なし)shadowsあなたの特性(またはグローバル - 私はそれがメソッド名からクラスだ推測している)touchesBegan()メソッドのローカル変数で:

コンピュータプログラミングでは、変数シャドウイングは、特定のスコープ(判定ブロック、メソッド、または内部の クラス)内で宣言された変数 が外部スコープで宣言された変数と同じ名前を持つ場合に発生します。

あなたはそれを動作させるためにvarまたはlet宣言を削除することができます。

self.x1 = location.x 
self.y1 = location.y 

x1 = location.x 
y1 = location.y 

..orあなたは明示的にそれをより明確にするためにselfでプロパティを修飾することができますこの暗黙的なシャドーイング動作については、いくつかの議論があるようで、将来的には変更される可能性があります。https://google.com/search?q=variable+shadow+site:swift.org

関連する問題