UIViewにextensionする形でgetImage()という関数(UIImageの型でreturn)を定義しました。
関数の内容としてはViewを画像に変換する、というものです。
それを
struct ContentView: View { var body: some View { ScrollView([.horizontal, .vertical]){ VStack{ Image("SampleImage") .frame(width:1000, height: 800) .aspectRation(contentMode: .fit) .overlay(Text("文字")) } } .frame(maxWidth: .infinity, maxHeight: .infinity) let image1 = UIView.getImage() } }
という形で実行しようとすると
instance member 'getImage' cannot be used on type 'UIView';
did you mean to use a value of this type instead?
というエラーが発生してしまいます。
定義している関数そのものはネットの有識者の方のものを書き写させてもらい、関数自体にエラーは発生していません。
なので、おそらく私が初学者ゆえに実行そのもので何か間違っているのだと思うのですが、検索してもどうしてもわかりませんでした。
お知恵を貸していただけると幸いです。
クラスとインスタンスの違いを理解する必要があるかと…。
https://terupro.net/swift-grammer-class
hosi-takanori様
素早い回答ありがとうございます!
教えていただいたURLを拝見したところ、
クラス(struct)そのものを変数に代入=インスタンス化(クラスそのものを使えるようにする?)
インスタンス化したものに対して関数を実行する
という手順が必要と考え、
let image1 = UIView().GetImage()
という形にし、黄色い警告が出てしまうので、var body: some View{}内にあったのを外に出しました。
この後、実行中に別のエラーが出てきてしまいましたがとりあえず今回質問させていただいた部分は上手くプログラムが走ったように感じています。
この認識でhoshi-takanori様に教えていただいたことを何となくでも理解できているでしょうか?
文法的にはそれでコンパイルできるようになるかも知れませんが、そもそもどのビューの、どんな内容を画像にしたいのでしょうか?
let image1 = UIView().GetImage()
ってことは、新規の UIView (内容は何もない) を生成して、それを画像にするってことになりますが…。
あと、余計なお世話ですが、Swift ではメソッド名は小文字で始めるのが一般的なので、GetImage じやなくて getImage の方が良いかと。
ご指摘感謝します!
getImageに変更しました!
また、メインの部分に関してまさにおっしゃる通りで「予想外のnilが出ました」というようなエラーを吐いている状態です。
本当に勉強不足でお恥ずかしい限りです。
本来は、ContentViewに表示されているImageとそこにoverlayされているTextをまとめて一つの画像にしたいと思っています。
いわゆる画像加工アプリに近いものを作りたいと思っているのですが、このContentViewでoverlayしているTextはあくまでView内で重なっているだけだと認識しており、一度UIViewをUIImageに変換する必要があると考え、試しています。
なので、初心者考えですとContentView内のImageの下でgetImage()を走らせて新しい変数に画像を入れておき、保存ボタンか何かでその変数(UIImage)を保存できる状態を作れば良いのではないかと考えていたのですが、そもそもの認識が間違っているようなので、お時間が許しましたら再度ご指摘くださるとうれしいです。

回答1件
あなたの回答
tips
プレビュー