質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

797閲覧

SwitUIで@EnvironmentObjectを利用する際、Struct内で使えません

BONO99

総合スコア3

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2021/12/07 14:55

前提・実現したいこと

SwiftUIを使ったアプリを制作しております。
@EnvironmentObjectを用いて、「アプリ名APP.swift」内に作成したClassの値を別の「.swift」ファイルで参照しようとしています。
1つの「.swift」ファイル内で参照してきた値が使える場所と使えない場所が出てきて解決策が見つかりません。

発生している問題・エラーメッセージ

Instance member 'user' cannot be used on type 'DetectSoundsView'

該当のソースコード

Swift

1 2import Foundation 3import SwiftUI 4import AVFoundation 5 6struct DetectSoundsView: View{ 7 8 @EnvironmentObject var user : User 9 10 // Viewのパーツ 11 static func generateMeter(confidence: Double) -> some View { 12 13 let mail = "(user.value2)" //ここにエラーが発生してしまいます 14 15 if numLitBars >= 13{ 16 let smtpSession = MCOSMTPSession() 17 smtpSession.hostname = "smtp.gmail.com" 18 smtpSession.username = "@gmail.com" 19 smtpSession.password = "" 20 smtpSession.port = 465 21 smtpSession.authType = MCOAuthType.saslPlain 22 smtpSession.connectionType = MCOConnectionType.TLS 23 smtpSession.connectionLogger = {(connectionID, type, data) in 24 if data != nil { 25 if let string = NSString(data: data!, encoding: String.Encoding.utf8.rawValue){ 26 NSLog("Connectionlogger: (string)") 27 } 28 } 29 } 30 31 let builder = MCOMessageBuilder() 32 33 builder.header.to = [MCOAddress(displayName: "送信先", mailbox: mail)!] 34 builder.header.from = MCOAddress(displayName: "", mailbox: "@gmail.com") 35 builder.header.subject = "" 36 builder.htmlBody = "" 37 38 let rfc822Data = builder.data() 39 let sendOperation = smtpSession.sendOperation(with: rfc822Data) 40 sendOperation!.start { (error) -> Void in 41 if (error != nil) { 42 NSLog("Error sending email: (String(describing: error))") 43 } else { 44 NSLog("Successfully sent email!") 45 sleep(30) 46 } 47 } 48 } 49 50 else if numLitBars <= 13{} 51 52 return VStack(spacing: barSpacing) { 53 ForEach(0..<numBars) { 54 Rectangle() 55 .foregroundColor(barColors[numBars - 1 - $0]) 56 .opacity(barOpacities[numBars - 1 - $0]) 57 .frame(width: barDimensions.0, height: barDimensions.1) 58 } 59 }.animation(.easeInOut, value: confidence) 60 } 61 62 63 var body: some View { 64 VStack { 65 Text("(user.value2)").font(.title).padding() //ここには参照してきた値が反映されます 66 67struct DetectSoundsView_Previews: PreviewProvider { 68 static var previews: some View { 69 /*@START_MENU_TOKEN@*/Text("Hello, World!")/*@END_MENU_TOKEN@*/ 70 } 71} 72

補足情報(FW/ツールのバージョンなど)

Swift5 / Xcode13.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BONO99

2021/12/08 01:36

ご教示有難うございます!!なるほど、だからこのstatic内ではエラーが出てしまっていたのですね;; どうしても変数を持ってきて中の値を書き換えて使いたいのですが、単純にstatic を classに置き換えてもエラーが発生してしまいました…(他の部分と干渉してしまっているのかも??) 何か解決策や代替案などの可能性などはありませんでしょうか?
hoshi-takanori

2021/12/08 04:50

単純に static func をただの func にすれば良いだけでは…。
BONO99

2021/12/10 00:54 編集

(修正します!) 1か所、staticを外し忘れていました(-_-;) ご教示のとおりエラーがすべて消え去りました!ありがとうございます!
guest

回答1

0

自己解決

staticメソッドの中ではインスタンス変数が使えないということで、同じ「.swift」内にあったstaticを全部外したら解決いたしました。

hoshi-takanoriさんありがとうございました!

投稿2021/12/10 00:58

BONO99

総合スコア3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問