_mitty
@_mitty

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

SwiftUIで配列を昇順に並べ替えて表示する方法について

解決したいこと

Swift初心者です。
Swiftの勉強で、.sort()を使用して配列を昇順に並べ替え、任意の要素を取り出してTextビューで表示しようとしたところ以下のエラーが発生しました。

具体的には、

var body: some View {} の中で、
newarray1(以下ソースコードで宣言している配列の名称)に対し、filterメソッドを使用しTextビューで表示することには成功したのですが、
newarray2(以下ソースコードで宣言している配列の名称)に対し、sortメソッドを使用しTextビューで表示しようとしたところ、うまくいきませんでした。

前者はうまくいくのに、後者がうまくいかない理由がよく分かりません。

var body: some View {} の中では、ビューの制御に関すること以外(ただの四則演算など)ができないことは、なんとなく分かっているのですが、Viewプロトコルに関する理解が浅く、問題解決できずにいます。

解決方法のご教授、よろしくお願いします。

発生している問題・エラー1

let newarray2 = testarray2.sort() の部分で、以下の警告文が出ています

Constant 'newarray2' inferred to have type '()', which may be unexpected

発生している問題・エラー2

Text("(newarray2[0])") の部分で、以下のエラー文が出ています

Value of type '()' has no subscripts

該当するソースコード

//Xcodeのバージョン Version 12.3 (12C33)
//Swiftのバージョン Apple Swift version 5.3.2

import SwiftUI

var testarray1: [String] = ["a", "bb", "ccc", "dddd", "eeeee", "ffffff"]
var testarray2: [String] = ["c", "a", "d", "b", "e", "f"]


struct ContentView: View {
    var body: some View {

        //うまく表示できた--------------------------------------
        //配列内の条件にあう要素だけ抽出(文字数が5文字よりも多いもの)
        let newarray1 = testarray1.filter{ $0.count > 5}
        Text("\(newarray1[0])")
        //----------------------------------------------------

        //うまく表示できなかった----------------------------------
        let newarray2 = testarray2.sort() //昇順にソート
        Text("\(newarray2[0])") 
        //----------------------------------------------------


    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
0

2Answer

エラーメッセージ

Constant 'newarray2' inferred to have type '()', which may be unexpected

とは「newarray2が「()型」になっているけれど、何か間違えてない?」という警告です。この「()型」はVoidとも呼ばれ、戻り値のない関数は全てVoidを返すことになっています。

つまり例えば

let value = print("value") //valueは「()型」

のようになると言うことです。

let newarray2 = testarray2.sort() //昇順にソート

このコードがエラーになるのはsortVoidを返す関数だったからです。filterとは違い、ソートはsortsortedの2種類が存在し、ソートした値を返すのは後者です。ですので

let newarray2 = testarray2.sorted() //昇順にソート

とすれば動きます。
filterが戻り値があるのにsortが戻り値がないのは、命名に一貫性がないですよね・・・。

なお

Value of type '()' has no subscripts

ですが、これは「()型はsubscriptを持ってないよ」というエラーです。大雑把にいうと「()型の値であるtestarray2には[0]のように添字をつけられないよ」という意味です。

Swiftを勉強し始めたばかりとのことなのでsubscriptはご存知ないかもしれませんが、このエラーについては上の修正で一緒に消えるので、深く悩む必要はないと思います。

2Like

Comments

  1. @_mitty

    Questioner

    早速のご回答ありがとうございます。
    ご指摘の通りに修正することでうまくいきました。

    ()型について触れてくださったので、エラー文の意味が理解できました。
    また、命名に一貫性がないとのご意見で、深く悩まず先に進めそうです。

    ありがとうございます。
  2. @_mitty

    Questioner

    先日ご回答いただいた内容について追加で教えていただきたいことがあります。
    本質問では、 .sort()→.sorted() の修正で解決できましたが、.append()で要素の追加をしようとしたところ、同様の問題にぶつかりました。
    私の認識では、var body: some View {} の中にはビューの表示に関する処理以外は書くべきではない(そもそも書けない)となっているのですが、
    では、どのように書くのが一般的なのでしょうか。

    新しくQ&Aを出させていただきましたので、そちらについてもお力添え頂けますと幸いです。
    よろしくお願いします。

    https://qiita.com/_mittttz/questions/b17e44aeae2c2804e363

Comments

  1. 全然違いましたね。。。すみません。
  2. @_mitty

    Questioner

    とんでもありません。
    ご回答ありがとうございます。

Your answer might help someone💌