66721


スクロールビューで５ページ分スクロールするアプリを作成しました。  
ラベルは５ページ分反映したのですが、画像が反映されません。

[![画像の説明をここに入力](https://i.stack.imgur.com/vzVoyl.png)](https://i.stack.imgur.com/vzVoyl.png)

## 実現したいこと

スクロールビューに画像を表示したい

## 試したこと

下記のコードで警告文が出ており、調べてみたところfor文の中に「i」の記述がされていないため出ているというところまでわかりましたが、その後どのように記述していいかわからず止まりました。

[code]

     let image = imageArray[i]
    
[/code]

## 警告内容

[code]

    Initialization of immutable value 'image' was never used; consider replacing with assignment to '_' or removing it
    
[/code]

## ViewController.swift

[code]

    import UIKit
    class ViewController: UIViewController {
    
        @IBOutlet weak var scrollView: UIScrollView!
    
        var imageArray = ["1","2","3","4","5"]
    
        var tittleArrary = ["砂漠","人","抽象的","笑顔","家族"]
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            //ページングを有効にする
            scrollView.isPagingEnabled = true
    
            //５ページ分の幅で、高さはViewの高さに設定する
            scrollView.contentSize = CGSize(width: view.frame.size.width*5, height: view.frame.size.height)
    
            for i in 0...4{
                print(i)
    
                let imageView = UIImageView()
                let image = imageArray[i]
                imageView.frame = CGRect(x: CGFloat(i)*view.frame.size.width, y: 0, width: view.frame.size.width, height: view.frame.size.height)
                imageView.contentMode = .scaleAspectFit
    
                let label = UILabel(frame: CGRect(x: CGFloat(i)*view.frame.size.width, y: view.frame.size.height - view.frame.size.height/4, width: scrollView.frame.size.width, height: 100))
                label.font = UIFont.boldSystemFont(ofSize: 15.0)
                label.textAlignment = .center
                label.text = tittleArrary[i]
                label.textColor = .black
    
                scrollView.addSubview(imageView)
                scrollView.addSubview(label)
    
            }
    
        }
    }
    
[/code]


CC BY-SA 4.0
2020-05-17T11:21:39.707
66716
2020-05-17T14:44:19.697
2020-05-17T11:32:06.337
3060
40195
question
swift
スクロールビューで画像を表示したい（配列）


あなたのiOSプログラミングやSwift言語に対する習熟度がどの程度かわからないので、少し長文になってしまいました。最後の結論の部分までは、ご自身が十分理解できているところはざっくり飛ばしながら読んでいってください。

* * *

まず、 ** _for文の中に「i」の記述がされていないため出ている_** と言うのは誤りです。

表示された警告内容はfor文とは全く関係ありません。(おそらくエラーメッセージで検索して、出てきた最初の日本語記事をざっくり眺めたりしたんでしょうが、「検索で最初の方に出てきた記事が自分にとって正解とは限らない」と言うのをしっかり頭に入れて、自分のケースに当てはまるかどうか吟味するようにしてください。)

[code]

    Initialization of immutable value 'image' was never used; consider replacing with assignment to '_' or removing it
    
[/code]

(拙訳)

[code]

    あなたが初期化した定数'image'は全然使われてないですよ。(使いもしないものを宣言するくらいなら'image'なんて名前をつけずに)'_'に置き換えるか、(その宣言自体を)削除するとかも考えてみてください。
    
[/code]

要は、せっかく配列の中から`i`番目の要素を取り出すなんてことをしたのに、その結果を使ってないじゃないですか、と言われているわけです。

例えば、コードの後半に`label.text = tittleArrary[i]`なんて、行がありますが、その行を

[code]

                let text = tittleArrary[i]
    
[/code]

なんて置き換えてやると、同じ内容の警告が現れて、ラベルの中身が空っぽになる(表示されなくなる)と言う結果になるのは、理解できるでしょうか?

`UILabel`に表示される中身は、`text`と言うプロパティに`String`型の値として設定してやります。`tittleArrary`は`String`型の配列ですから、`tittleArrary[i]`は`String`型の値になりますので、そのまま`label`のプロパティ`text`に代入できます。

従って、

[code]

                label.text = tittleArrary[i]
    
[/code]

`label`で表される`UILabel`に表示される中身を、`tittleArrary[i]`に設定する、と言う動作になります。

* * *

一方、`UIImageView`に表示される中身は、`image`と言うプロパティに`UIImage`型の値として設定してやらないといけません。

  * `image`と言う名前の変数(定数)ならなんでも良いわけじゃない
  * `UIImage`型でないといけない、`String`型ではいけない

あなたの現在のコードでは`image`と言う定数は`String`型ですから、`UILabel`の時の真似をして、`imageView.image =
image`なんてやるとエラーになってしまいます。

(もしかして、エラーより警告がマシだとか思って、現在のコードに書き換えられたのでしょうか?)

* * *

### 画像を表示する部分のコードは、こんな感じにしないといけません。

[code]

                let imageView = UIImageView()
                let imageName = imageArray[i]
                imageView.image = 「`imageName`から`UIImage`型の値を作る」
                imageView.frame = CGRect(x: CGFloat(i)*view.frame.size.width, y: 0, width: view.frame.size.width, height: view.frame.size.height)
                imageView.contentMode = .scaleAspectFit
    
[/code]

「`imageName`から`UIImage`型の値を作る」の部分で、`imageName`をちゃんと使ってやれば、「全然使われてないですよ」(`never
used`)なんて警告は出なくなります。

* * *

で肝心な「`imageName`から`UIImage`型の値を作る」の部分ですが、そこはあなたが`"1"`, `"2"`,
...と言う文字列に対して、どんな画像を表示したいのかによって、変わってきます。

以下は、 **あなたのプロジェクトの中に`1.jpg`, `2.jpg`, ...と言う5つの画像が存在する** と仮定した場合のコードです。

[code]

                let imageView = UIImageView()
                let imageName = imageArray[i]
                imageView.image = UIImage(named: "\(imageName).jpg") //「`imageName`から`UIImage`型の値を作る」やり方の一例
                imageView.frame = CGRect(x: CGFloat(i)*view.frame.size.width, y: 0, width: view.frame.size.width, height: view.frame.size.height)
                imageView.contentMode = .scaleAspectFit
    
[/code]

「仮定」が当てはまらなくて、ご自身で解決できない場合には、コメントなどで必要な情報をお知らせください。


CC BY-SA 4.0
2020-05-17T14:44:19.697
66721
2020-05-17T14:44:19.697
13972
66716
answer