🏄‍♂️

SwiftUIで「Expressions are not allowed at the top level」が出た時の対処法

2023/02/24に公開

今回は、下記のyoutubeでdelegateについて、勉強していた際にSwiftUIで行うと、Expressions are not allowed at the top levelエラーが出たのでその対処法について書いていきたいと思います。

https://youtu.be/4CLQXkfkJ9g

実際のコード

protocol DataSorce {
    func items() -> [String]
}

struct PrinterData {
    
    var delegate:DataSorce? = nil
    
    func printList() {
        if let delegate = delegate {
            let items = delegate.items()
            for item in items {
                print(item)
            }
        }else {
            print("itemsはありません")
        }
    }
}

struct NameData:DataSorce {
    func items() -> [String]{
        return ["ルフィ","サンジ","ゾロ"]
    }
}

var nameData = PrinterData()
nameData.delegate = NameData()
nameData.printList()

このようにするとSwiftUIではエラーが出てしまいます。
SwiftUIでは、構造体の中で定義しないといけないらしくトップレベルでの表現は許可されていないようなので、構造体を作ってあげることで解決できます。

解決後のコード

protocol DataSorce {
    func items() -> [String]
}

struct PrinterData {
    
    var delegate:DataSorce? = nil
    
    func printList() {
        if let delegate = delegate {
            let items = delegate.items()
            for item in items {
                print(item)
            }
        }else {
            print("itemsはありません")
        }
    }
}

struct NameData:DataSorce {
    func items() -> [String]{
        return ["ルフィ","サンジ","ゾロ"]
    }
}

struct Data {
    var printData:DataSorce = {
        var nameData = Printer()
        nameData.delegate = NameData()
        nameData.printList()
        return
    } as! DataSorce
}

自分はこれで解決できました。
他にもいい方法があると思うので、もしあれば教えて頂きたいです。

Discussion