20210730のSwiftに関する記事は6件です。

UISliderでUIColorのRGBの値を表示するApp

完成形はこんな感じ UILabelとUISliderの色はMain.storyboardで設定してます。 機能説明  画面のUISliderでRGBの値を変化させてViewの.backgroundColorを変えます。 コードと簡単解説 UISliderの最初の位置を一番左にしたいので、3つのUISliderの.valueを0.00にしています。 UISliderの最小値はもちろん0(RGBには0~1の値が入ります)なので、3つのUISliderの.minimumValueを0.00にしてます。 UISliderの最大値はもちろん1(RGBには0~1の値が入ります)なので、3つのUISliderの.maximumValueを1.00にしてます。 最初にcolorDebugView.backgroundColor = UIColor.blackなのはUISliderの値が0.00だからです。 ViewController import UIKit class ViewController: UIViewController { @IBOutlet weak var colorDebugView: UIView! @IBOutlet weak var redSlider: UISlider! @IBOutlet weak var greenSlider: UISlider! @IBOutlet weak var blueSlider: UISlider! @IBOutlet weak var redValueLabel: UILabel! @IBOutlet weak var greenValueLabel: UILabel! @IBOutlet weak var blueValueLabel: UILabel! let colorConverterModel = ColorConvertModel() override func viewDidLoad() { super.viewDidLoad() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) colorDebugView.backgroundColor = UIColor.black redSlider.value = 0.00 redSlider.minimumValue = 0.00 redSlider.maximumValue = 1.00 greenSlider.value = 0.00 greenSlider.minimumValue = 0.00 greenSlider.maximumValue = 1.00 blueSlider.value = 0.00 blueSlider.minimumValue = 0.00 blueSlider.maximumValue = 1.00 } @IBAction func redSlide(_ sender: UISlider) { colorConverterModel.colorConvert(redValue: CGFloat(sender.value), greenValue: CGFloat(greenSlider.value), blueValue: CGFloat(blueSlider.value), targetView: colorDebugView) redValueLabel.text = String(floor(sender.value * 100) / 100) } @IBAction func greenSlide(_ sender: UISlider) { colorConverterModel.colorConvert(redValue: CGFloat(redSlider.value), greenValue: CGFloat(sender.value), blueValue: CGFloat(blueSlider.value), targetView: colorDebugView) greenValueLabel.text = String(floor(sender.value * 100) / 100) } @IBAction func blueSlide(_ sender: UISlider) { colorConverterModel.colorConvert(redValue: CGFloat(redSlider.value), greenValue: CGFloat(greenSlider.value), blueValue: CGFloat(sender.value), targetView: colorDebugView) blueValueLabel.text = String(floor(sender.value * 100) / 100) } } 昨日に引き続き、UIColor(red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat)を用いて色を変えていきます。 alphaは1で固定します。 ColorConvertModel import Foundation import UIKit class ColorConvertModel{ func colorConvert(redValue:CGFloat,greenValue:CGFloat,blueValue:CGFloat,targetView:UIView){ targetView.backgroundColor = UIColor(red: redValue, green: greenValue, blue: blueValue, alpha: 1) } } 終わり ご指摘、ご質問などありましたら、コメントまでお願い致します。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Swiftのinit(イニシャライザ)のオーバーロードはconvenienceで行う

initのオーバーロード Swiftでのinit(イニシャライザ)のオーバーロードはほかの言語とは子なり、少し特殊です。 Swiftではconvenienceを使用することで、オーバーロードが可能です。 class Alert { var title : String var message : String var level : Int init(title : String, message : String, level : Int) { self.title = title self.message = message self.level = level } convenience init(title: String) { let message = "デフォルト" let level = 0 self.init(title : title, message : message, level : level) } convenience init(message: String) { let title = "デフォルト" let level = 0 self.init(title : title, message : message, level : level) } func show() { print("\(self.title) \(self.message) \(self.level)") } } let alert1 = Alert(title: "title", message : "Hello", level : 1) let alert2 = Alert(title: "タイトル") let alert3 = Alert(message : "メッセージ") alert1.show() alert2.show() alert3.show()
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[2021/07/30更新]個人開発アプリにSwiftFormatを導入する

投稿の経緯 機械的にコードチェックをおこない、コードの統一化、可読性の向上、、開発効率の向上を期待してSwiftUIで開発中の個人アプリにはじめてSwiftFormatを導入したので記事にしました。 環境 Swift version 5.4.2 Xcode version 12.5.1 SwiftFormatとは 公式ページには以下のように記載されています。 What is this? SwiftFormat is a code library and command-line tool for reformatting Swift code on macOS or Linux. SwiftFormat goes above and beyond what you might expect from a code formatter. In addition to adjusting white space it can insert or remove implicit self, remove redundant parentheses, and correct many other deviations from the standard Swift idioms. Why would I want to do that? Many programmers have a preferred style for formatting their code, and others seem entirely blind to the existing formatting conventions of a project (to the enragement of their colleagues). When collaborating on a project, it can be helpful to agree on a common coding style, but enforcing that manually is tedious and error-prone, and can lead to arguments if some participants take it more seriously than others. Having a tool to automatically enforce a common style eliminates those issues, and lets you focus on the behavior of the code, not its presentation. 要約すると、selfや不要な空白の削除の修正を機械的におこなうライブラリであり、導入するメリットは、プログラマ個人のこだわった書き方でチーム開発をおこなうと、不要な議論が生まれて開発に集中できなくなるので、このツールを使ってチームでの共通化と自動修正を実現し、その問題を事前に防ぎましょう。 といったところでしょうか? cocoaPodsでの導入 導入はCocoaPodsを選定しました。 ?以下理由? フォーマッターのインストールはhomebrewなどを使って各自の環境にインストールするという手段もあるが、複数人で開発を行う場合に、各自のインストールしているバージョンに違いが発生する恐れがる。 cocoaPodsにしておけばインストールされるバージョンが固定されるので意図しないバージョンが使われてしまうといった恐れがなくなるメリットがある。 pod 'SwiftFormat/CLI', :configurations => ['Debug'] pod installして導入しましょう。 SwiftFormatを動かすPhaseを作る Compile Sourcesの前にRunscriptを作成し、SwiftFormatを動かすPhaseを作ります。 if [ $CONFIGURATION = "Debug" ]; then "${PODS_ROOT}/SwiftFormat/CommandLineTool/swiftformat" . fi これは、SwiftFormatでコードを整形 > 整形された状態でコンパイルとする為です。 swiftversionの指定 このままだとSwiftFormatが、どのバージョンのSwiftに対してコードを整形したらいいかが分からないのでWarningが発生します。なので、オプションに自身の環境で使用しているSwiftのバージョンを追加します。 --swiftversion 5.4.2 こちら?を追記して if [ $CONFIGURATION = "Debug" ]; then "${PODS_ROOT}/SwiftFormat/CommandLineTool/swiftformat" . --swiftversion 5.4.2 fi こうなればOKです。 オプションを追加する swiftversionの指定で対応したように、他にもオプションを設定できます。 今回は ・PodsのソースをSwiftFormatの対象から外す ・ルールを無効にする この2点をオプションとして追加してみたいと思います。 PodsのソースをSwiftFormatの対象から外す Podsのソースは直接触ることがないので、整形の対象がら外します。 --exclude Pods こちらを追記します。 ルールを無効にする SwiftFormatにはルールが存在し、ルールに従いたくない場合にオプションを追加します。 ルール一覧 ( 公式 ) ルール一覧 ( 日本語版 ) このルールを無効化したい場合は、--disable ルール名で無効化できます。 例えば、andOperatorを無効化したい場合は --disable andOperator これで無効化できます。 各オプションを反映するとSwiftFormatを動かすPhaseは?以下のようになります。 if [ $CONFIGURATION = "Debug" ]; then "${PODS_ROOT}/SwiftFormat/CommandLineTool/swiftformat" . --exclude Pods --swiftversion 5.4.2 --disable andOperator fi これでビルド完了後にSwiftFormatが動作します! 参考にしてください。 お知らせ 現在、iOS開発案件を業務委託で募集中です(副業)。TwitterDMでご依頼をお待ちしています。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Swift触り始めてからの疑問点をとりあえず記事にする

はじめに こんにちは。先日は私の初投稿である経歴の記事が200人近くの方に読んでいただいたようで感謝の念に堪えません。 自身のトラウマを昇華できる反面、人生の中でも直近の失敗なので思い出す作業が割と辛い。なので思い出して文字にする作業に少しお時間を頂きます。あのような拙い文章でも読んでくださってありがとうございます。 さて、Qiitaで記事を投稿しようとしたきっかけはもちろん、プログラミング職に就こうと思っているからです。私はさまざまなプログラミング職の中でもiOSエンジニアを目指しています。 そのためまだ勉強し始めて1週間程度ですが、Swiftを中心に勉強をしています。なぜIT職を次の転職先にしようと決めたのか、なぜiOSエンジニアにしようかと思ったかは後日記事にしようかと考えています。なにせ、全く知識のない業界なのでそれなりに疑問が湧きましたし、悩みました。 このようなほぼ何も分かっていない状態でも、そのような記事でも残せば少しは価値があるのではないかと考えています。なぜなら退職した直後、傷ついていた自分に支えになったものとして同じ境遇の人の動画や記事があります。 私と同じ悩みを抱えながら会社に通っている人、私と似たような境遇に陥り会社を辞めてしまった人、結果はどうであれ新しいことにチャレンジしてどのような経過を辿ってどのようなこと学んだかの経験などをYoutubeやnoteでたくさん見て次へふだみすための燃料となりました。 アウトプットしてくれた彼らの全てが結果的に成功しているわけではありませんでしたが、自身の失敗や感じたことを発信することは勇気がいる行動です。私も彼らに習って、発信を続けられらな、と思います。アウトプットすることの練習にもなりますしね! なので些細なことでも時間あれば発信するしようかと思っています。「こんなことでつまづいているんかい…」とお思いの先輩方も「自分もこれわからないor同じこと起きたなあ」と思った同じエンジニアを目指している方々もお付き合いよろしくお願いします。 本題 自分がどのくらい初心者なのか、なぜSwiftを選んだかは後で記事にしますので展開が急で申し訳ないのですが、早速今日まで感じた疑問などを書いていこうと思います。 現在プログラマー職にしようかなあと色々調べ始めて1週間ぐらいでProgateでHTML、CSSの中級編と、 UdemyでみんなのiOS講座 ゼロからSwiftで学ぶiPhoneアプリ開発の基礎を学んでいます。 今までの講義でそこまで詰まったポイントはないのですが、講師の画面通りにいかないことがありましたので、メモ代わりにおいてこうと思います。 この講義はXcodeを用いてアプリを開発しながら学ぶ形式なのですが、この講義が作られた時のXcodeのバージョンがXcode9.2で現在のXcodeのバージョンがXcode12.4なので少しUIが異なっています。バージョンアップによる補足はあるのですが、この変更のためかわからないのですが講義通りにいかない箇所がありました。質問機能があるので解決しようと思えば教えてもらえるのですが現在までで講義が進行不能になるレベルではないので今は記事にして残すだけに留めます。 ①実機での動作確認ができない こちらが講義の最初で作る最初のアプリ。Buttonを押したらLabelがHello,World!になるというだけのものです。この講義では最初に文法などを学ぶのではなく、少し講義通りに操作してみてアプリケーションがどのように作られるかをざっくりと掴む形のようです。 この中で実機で動かすという作業があるのですが2種類のエラーが出てしまいました。しかしこの記事を書いている時に試したところ解決していました。 ここまで書いてしまったのでとりあえず共有したいと思います。 1.Errors were encountered while preparing your device for development. Please check the Devices and Simulators Window. 解決してしまったので画像がありませんが、7/29にiPhoneを接続して実機テストをしようと思って講座の手順を行いbuild&runをクリックしたところErrors were encountered while preparing your device for development. Please check the Devices and Simulators Window.とのメッセージとともに一生グルグルマーク。これが解決しなければ自分は一生自機iPhone(XR)でテストできないのか…?と絶望。 とりあえずエラー文コピってググったところ以下のサイトに解決法が。 iPhoneの実機テストでのビルドエラー。証明書関係?? 私はいつの間にか解決していたので再現できなかったのですが、このサイトにある画像通りのエラーが出ました。内容はよくわかりませんでしたが、当日にApple Developmentのアカウント登録を行ったのでなんか反映されていないのかな?と思いつつ、サイトの通りにiPhoneを再起動。 ここから自分のバカポイントなのですが、同時にFEの勉強中であったため、そのままほったらかしにしてこのことを忘れてました。翌日build&runをしたところこのエラーは表示されなくなってました。実際に再起動が良かったのか少し時間おいたのが良かったのかわからなかったですがとりあえず解決。しかしまた別のエラーが発生。 2.Xcode cannot launch FirstXcode on (iPhone名)のiPhone because the device is locked. 1のエラーと同じく、build&runを押すと同時に発生。英語不得意マンの自分でもiPhoneのロックを解除すればええんや、と勘づきiPhoneのロックを解除して再び試すが再び同じエラーが発生。 しょうがないのでググったところ、以下のサイトの通りにXcodeのデバイス登録を一旦解除してまた登録するという方法で解決。 アンロック状態なのに「Unlock xxx の iPhone to Continue」が出る【Xcode実機ビルド】 感想 なんかこうして記事にしてみると割としょーもないことでエラーが色々発生するんだなと実感。このような簡単な処理でも実際にエラーが出るとなんで??となり、もう一回講義を再生したり、自分流の解決法を見つけようとするが結局わからずググるみたいな行為の連続です。 しかもそれなりしょーもない一つのエラーに対して割とエネルギーと時間を削がれる。これからの目標としてエラーが発生した際にかける時間を減らしていきたい。 あとこんなしょーもないエラーを報告するブログでもかなり時間を取られる。実はこれまでの文も全く下書きなど用意せずに書いています。どっちも同じぐらい時間取られるかなって思って下書き用意せずに思ったまま書いています。 本日は以上です。ここまで見てくださってありがとうございました!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Swift触り始めてからの疑問点(解決済)をとりあえず記事にする

はじめに こんにちは。先日は私の初投稿である経歴の記事が200人近くの方に読んでいただいたようで感謝の念に堪えません。 自身のトラウマを昇華できる反面、人生の中でも直近の失敗なので思い出す作業が割と辛い。なので思い出して文字にする作業に少しお時間を頂きます。あのような拙い文章でも読んでくださってありがとうございます。 さて、Qiitaで記事を投稿しようとしたきっかけはもちろん、プログラミング職に就こうと思っているからです。私はさまざまなプログラミング職の中でもiOSエンジニアを目指しています。 そのためまだ勉強し始めて1週間程度ですが、Swiftを中心に勉強をしています。なぜIT職を次の転職先にしようと決めたのか、なぜiOSエンジニアにしようかと思ったかは後日記事にしようかと考えています。なにせ、全く知識のない業界なのでそれなりに疑問が湧きましたし、悩みました。 このようなほぼ何も分かっていない状態でも、そのような記事でも残せば少しは価値があるのではないかと考えています。なぜなら退職した直後、傷ついていた自分に支えになったものとして同じ境遇の人の動画や記事があります。 私と同じ悩みを抱えながら会社に通っている人、私と似たような境遇に陥り会社を辞めてしまった人、結果はどうであれ新しいことにチャレンジしてどのような経過を辿ってどのようなこと学んだかの経験などをYoutubeやnoteでたくさん見て次へふだみすための燃料となりました。 アウトプットしてくれた彼らの全てが結果的に成功しているわけではありませんでしたが、自身の失敗や感じたことを発信することは勇気がいる行動です。私も彼らに習って、発信を続けられらな、と思います。アウトプットすることの練習にもなりますしね! なので些細なことでも時間あれば発信するしようかと思っています。「こんなことでつまづいているんかい…」とお思いの先輩方も「自分もこれわからないor同じこと起きたなあ」と思った同じエンジニアを目指している方々もお付き合いよろしくお願いします。 本題 自分がどのくらい初心者なのか、なぜSwiftを選んだかは後で記事にしますので展開が急で申し訳ないのですが、早速今日まで感じた疑問などを書いていこうと思います。 現在プログラマー職にしようかなあと色々調べ始めて1週間ぐらいでProgateでHTML、CSSの中級編と、 UdemyでみんなのiOS講座 ゼロからSwiftで学ぶiPhoneアプリ開発の基礎を学んでいます。 今までの講義でそこまで詰まったポイントはないのですが、講師の画面通りにいかないことがありましたので、メモ代わりにおいてこうと思います。 この講義はXcodeを用いてアプリを開発しながら学ぶ形式なのですが、この講義が作られた時のXcodeのバージョンがXcode9.2で現在のXcodeのバージョンがXcode12.4なので少しUIが異なっています。バージョンアップによる補足はあるのですが、この変更のためかわからないのですが講義通りにいかない箇所がありました。質問機能があるので解決しようと思えば教えてもらえるのですが現在までで講義が進行不能になるレベルではないので今は記事にして残すだけに留めます。 ①実機での動作確認ができない こちらが講義の最初で作る最初のアプリ。Buttonを押したらLabelがHello,World!になるというだけのものです。この講義では最初に文法などを学ぶのではなく、少し講義通りに操作してみてアプリケーションがどのように作られるかをざっくりと掴む形のようです。 この中で実機で動かすという作業があるのですが2種類のエラーが出てしまいました。しかしこの記事を書いている時に試したところ解決していました。 ここまで書いてしまったのでとりあえず共有したいと思います。 1.Errors were encountered while preparing your device for development. Please check the Devices and Simulators Window. 解決してしまったので画像がありませんが、7/29にiPhoneを接続して実機テストをしようと思って講座の手順を行いbuild&runをクリックしたところErrors were encountered while preparing your device for development. Please check the Devices and Simulators Window.とのメッセージとともに一生グルグルマーク。これが解決しなければ自分は一生自機iPhone(XR)でテストできないのか…?と絶望。 とりあえずエラー文コピってググったところ以下のサイトに解決法が。 iPhoneの実機テストでのビルドエラー。証明書関係?? 私はいつの間にか解決していたので再現できなかったのですが、このサイトにある画像通りのエラーが出ました。内容はよくわかりませんでしたが、当日にApple Developmentのアカウント登録を行ったのでなんか反映されていないのかな?と思いつつ、サイトの通りにiPhoneを再起動。 ここから自分のバカポイントなのですが、同時にFEの勉強中であったため、そのままほったらかしにしてこのことを忘れてました。翌日build&runをしたところこのエラーは表示されなくなってました。実際に再起動が良かったのか少し時間おいたのが良かったのかわからなかったですがとりあえず解決。しかしまた別のエラーが発生。 2.Xcode cannot launch FirstXcode on (iPhone名)のiPhone because the device is locked. 1のエラーと同じく、build&runを押すと同時に発生。英語不得意マンの自分でもiPhoneのロックを解除すればええんや、と勘づきiPhoneのロックを解除して再び試すが再び同じエラーが発生。 しょうがないのでググったところ、以下のサイトの通りにXcodeのデバイス登録を一旦解除してまた登録するという方法で解決。 アンロック状態なのに「Unlock xxx の iPhone to Continue」が出る【Xcode実機ビルド】 感想 なんかこうして記事にしてみると割としょーもないことでエラーが色々発生するんだなと実感。このような簡単な処理でも実際にエラーが出るとなんで??となり、もう一回講義を再生したり、自分流の解決法を見つけようとするが結局わからずググるみたいな行為の連続です。 しかもそれなりしょーもない一つのエラーに対して割とエネルギーと時間を削がれる。これからの目標としてエラーが発生した際にかける時間を減らしていきたい。 あとこんなしょーもないエラーを報告するブログでもかなり時間を取られる。実はこれまでの文も全く下書きなど用意せずに書いています。どっちも同じぐらい時間取られるかなって思って下書き用意せずに思ったまま書いています。 本日は以上です。ここまで見てくださってありがとうございました!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

SwiftのProtocolとdelegateを理解する

Protocolとdelegateの関係 Protocolとdelegateの関係は密であり、Protocalでdelegateを実装するという関係です。 delegateを知る delegateは使わなくてもいい メリット:クラス側に処理の内容を任せるのではなく、自分で処理を決めることができる。 Protocolでdelegateを実装 protocol ButtonDelegate { func delegateClicked() } delegateを変数として宣言 class Button { var delegate: ButtonDelegate? func clicked() { if let delegate = delegate { // 自分で実装した処理 delegate.delegateClicked() } else { // 通常の処理 print("クリックされました") } } } Mainクラスを実装 ここから実際にMainクラスでのdelegateの使い方を説明していきます。 冒頭で説明したようにdelegateは必ずしも必要なわけではないので、Buttonクラスでdelegate変数を宣言しましたが、使用しない方法を説明していきます。 delegateなしの場合 class Main { let button = Button() func clicked() { button.clicked() } } let main = Main() main.clicked() // 「クリックされました」とprintされる delegateありの場合 Classは継承ですが、Protocolは適合といいます。 class MainWithDelegate : ButtonDelegate { // ButtonDelegateを適合 let button = Button() init() { button.delegate = self // delegateをインスタンス化 } func clicked() { button.clicked() } // 自前でdelegateClicked()を実装 // Protocolを適合したので、ButtonDelegate内で宣言された関数の処理を実装しないとコンパイルエラーになる // deletgateClicked()はButton.Click()時に呼ばれる func delegateClicked() { print("クリックされたよー") } } let mainWithDelegate = MainWithDelegate () mainWithDelegate.clicked() // 「クリックされたよー」とprintされる delegateのポイント delegateで実装した関数は自分で呼び出すわけではない 今回の例では、勝手にclicked()関数が呼び出している。なので実装しておしまいです。呼び出す必要はありません。 別の例 Figureクラスを使いたいがgetArea()が通常の処理では、横×縦の値が返ってくるが、それを2倍にする処理にしたい protocol FigureDelegate { func getAreaDelegate() -> Int } class Figure { var delegate : FigureDelegate? let width : Int let height : Int init(width: Int, height: Int) { self.width = width self.height = height } func getArea() -> Int { if let delegate = delegate { return delegate.getAreaDelegate() } else { return self.width * self.height } } } class Main : FigureDelegate { let figure = Figure(width: 5, height: 7) func setDelegate() { figure.delegate = self } func printArea() { print(figure.getArea()) } func getAreaDelegate() -> Int { return self.figure.width * self.figure.height * 2 } } let main = Main() main.printArea() main.setDelegate() main.printArea()
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む