参考にされた過去の質問を見てみましたが、今回のご質問には必要ない操作だと思います。
今回の質問を解決するためには、まずは変数のスコープ(可視範囲)について理解する必要があると思います。
上記のリンクなどで、宣言した変数(やメソッドなど)がどの範囲まで有効になるかをまず確認してみてください。
さて、下記のコードですが、
swift
1if coinCount == 0 {
2 // 宣言【1】
3 let coin = UIImageView(image: UIImage(named: "myImage"))
4 coin.center = sender.location(in: self.view)
5 self.view.addSubview(coin)
6 // 宣言【1】の有効範囲はここまで
7} else if coinCount == 1 {
8 // 宣言【2】
9 let coin = UIImageView(image: UIImage(named: "myImage"))
10 coin.image = nil
11 coin.setNeedsDisplay()
12 coin.layoutIfNeeded()
13 // 宣言【2】の有効範囲はここまで
14}
宣言【1】
でcoin
という変数を定義していますが、有効なのは前述のリンク先の説明通り宣言【1】の有効範囲はここまで
というところまでです。
一方、宣言【2】
でもcoin
という変数を定義していますが、これは宣言【1】
で宣言したcoin
という変数とは全く別の変数です。変数名は同じでも、スコープが違いますから別の変数として扱われます(逆に、同じスコープ内で同じ名前の変数を定義した場合、ごく一部の例外を除きコンパイルエラーとなります)。
従って、宣言【2】
で
swift
1 coin.image = nil
2 coin.setNeedsDisplay()
3 coin.layoutIfNeeded()
と行っている操作は、宣言【2】
で宣言しているcoin
という変数に対する操作です。宣言【1】
でサブビューに追加したcoin
という変数とは実体が違うが名前が同じcoin
という変数に操作しているため、宣言【1】
で追加した画像を消すことはできません。
解決するためには、宣言【1】
のブロック({}
で囲まれた範囲)と宣言【2】
のブロック両方で有効な変数を定義する必要があります。そのためには、もう一つ上の階層で変数を宣言する必要があります。
さらに、クリックしたときに画像を表示、あるいは消去するという操作を繰り返すためには、関数を再度呼び出しても有効に利用できる変数を用意する必要があります。
これらを考慮すると、このような感じに組み立てる必要があります。
swift
1class ViewController: UIViewController {
2
3 var coinCount = 0
4 // 複数回呼び出されても値を保持できるように、関数の外側で定義する
5 var coin: UIImageView = UIImageView()
6
7 @IBAction func addImage(_ sender: UITapGestureRecognizer) {
8 if coinCount == 0 {
9 // coinCount がゼロのとき
10 // 指定された画像をもとにImageViewを作る
11 coin = UIImageView(image: UIImage(named: "myImage"))
12 // ImageViewの中心座標をタップされた場所にする
13 coin.center = sender.location(in: self.view)
14 // 親ビュー(view)にサブビュー(coin)を追加して表示させる(実際に画面に表示するのはこの操作)
15 self.view.addSubview(coin)
16 } else if coinCount == 1 {
17 // 画像のビュー(coin)を親ビューから削除(unlink)する
18 coin.removeFromSuperview()
19 // 次の操作でも消えるが、登録した画像のビューは残ったままなのであまり良い操作ではないはず
20 // coin.image = nil
21 } // coinCount == 2 の時は何も起きない(条件判定がないため)
22 coinCount = coinCount + 1
23 coinCount = coinCount % 3
24 }
25
26 override func viewDidLoad() {
27 super.viewDidLoad()
28 // Do any additional setup after loading the view.
29 }
30}
追記
Xcode は変数のスコープを視覚的に確認できます(標準設定だと色が暗いのでわかりにくいのですが)。
確認したい変数にカーソルを合わせるだけで、同じスコープの変数すべて背景色が変わりますので、これで確認可能です。