なえT備忘録

何の参考にもならないかもしれませんが、いつかは参考になるようにします

this class is not key value coding-compliant for the key XXXX. だって!XXXのOutletの接続は問題ないのに!

と思っているそこのあなた

 

 

このエラー、要はクラスとIBオブジェクトの接続がうまくいってないということなんだけど、そもそもクラスの参照ができてないだけで、StoryBoard上のOutletとコードの紐付けは何も悪くないケースがあると判明した

 

というわけで、ケチをつけられたClassのCustom Class欄を見てみよう

 

Class欄したのModuleが空になってますね?

これ、要はこのクラスが存在するモジュール(プロジェクト)を示すもので、ここが空だとクラスの場所が見つからず、表題のエラーが起きるようです(入力欄の右ボタンを押せば、選択肢が出てくるので、ここから選ぶか inherit Modure from target /対象からプロジェクトを継承、対象って何だ? を選べば動いた)

 

今回、クラスを新しく作成したとき、クラスの参照場所が指定できていなかったようだ。それにしてもこんなエラー出されたら普通Outletの問題考えるやろ...何やかんや2時間くらい悩んでしもうたわ 俺の2時間返せバカタレ

みんなも同じ轍をふまんようにね

 

 

ちなみに今日はじめてMacでスクショとったけど、Command + Shift + 4 キーで任意の場所だけ指定してスクショが取れるみたい

これもついでに覚えておきましょう

 

 

チンパンでもわかるバインディング if let と guard let

●● if let とguard let の違い

 

 if let Huga = Hoge {

    func Hogehoge()

 }

 >>>>if let は オプショナル型に値があったときだけ、指定の処理を行う。

 

 guard let Huga = Hoge  else {

    func Hogehoge()

 }

 >>>>guard letは、オプショナル型に値がなかったときだけ、指定の処理を行う。

 

nilって単に値がないことの他、特定の関数ではエラー発生時の戻り値になってるので、エラー時の例外処理としてもつかえます。(API接続失敗時など)

 

 

説明されるとチンパンでもわかるけど、ぱっと見で見返せるメモが欲しかったので記載

 

これはチンパンのパンくんです 横の犬がチンくんです

 

 

世界一わかりやすくて終わってるDelegateの覚え方

まともにアプリつーかUIKitの勉強を始めて1週間か2週間か経ち、ようやくDelegateを理解したので解説

 

肝となるのは、

プロトコルで定義された何らかのイベントが実施されれば、それをトリガーとして実行するメソッドを設置でき、戻り値をプロトコルと同じクラス(厳密には

インスタンス生成されたもの)に格納できる

②実行されるメソッドは、プロトコルと同じクラス内でも、違うクラスにあってもいい。なので、ボタンが押されたりエンターが入力された、といった操作がされたクラス(ViewController等)と同一である必要はなく、ほかのクラス(例えば別の.swiftファイルだったり)にあるメソッドに処理を依頼して、戻り値を入手することもできる。

 

例えば、検索バーにキーワードを入れ、検索ボタンを押すと、親クラスにUISearchBarDelegateプロトコルが定義されていれば、その動作が通知となりsearchBarSearchButtonClickedメソッドが実行される。通知先をselfとし、このメソッドで検索バーに入ったキーワードをDB、APIへ送信する処理を入れておけば、同一クラス内の一連の動作とできる。

逆に、キーワードをDB,APIへ送信するメソッドを別のクラスに保管しておいても、viesDidLoad()などで通知先を別クラスに指定しておけば、そっちで処理した上でイベントがあったクラスに返してくれる。機能毎にクラスを分けておいた方が、再利用しやすいメリットもある。これが設計思想ってやつか

 

要は、所定のプロトコルに絡んだイベント(ボタン押すとか)が対象クラス内で発生した際、そのタイミングで別のクラスに既定のメソッド処理を依頼でき、その返り値を依頼元クラスに返すことができる ちなみに依頼せず自力で処理することもできる

 

分かりやすく言うと、  ニコニコスポーツバーでは、代表戦で日本が勝った瞬間、客Aが客Bにテキーラを飲ませて、吐いたゲロを渡すルールがある ちなみに自分で飲んでゲロを吐くこともできる(客Aはスポーツバーに日本が勝ったらテキーラを飲む、という決め事を押し付けた犯人で、しかもゲロをほしがる異常者である)

ニコニコスポーツバー 親クラス

日本が勝ったらテキーラを飲ませるルール Delegateプロトコル

客A 依頼元クラス(プロトコルに対応)

客B 依頼先クラス

テキーラ Delegateメソッド

ゲロ 戻り値

 

 

ゲロにまみれろよ

 

 

 

Xcode Account Authentication Errorの対処法

Xcodeの右上、エラーアラートが出るところに、前からずっと表題のエラーが出ている。

 

>>>>>>>>エラー詳細>>>>>>>>>>>>>>>>>>>>>>>>>>>>

There was a problem authenticating your Apple ID (hogehoge@huga.com).

Sign in again the Acccount preference pane.

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

 

StackOverFlowやらAppleのDeveloper Forumでも、同様のエラーについて、解決法を探している人がいたが、ざっと見たところ現状は解決できていないっぽい。かなしい。

(定期的に更新されるLicense AgreementをDeveloperサイト経由で確認すればいい、という意見も出ているが、自分でサイトを見たところこれも違うような気がする)

 

stackoverflow.com

 

developer.apple.com

 

そもそもこのエラー、ほっとくとなんかまずいんでしょうか?

答えは風の中

 

www.youtube.com

 

モーダルビューやらUIKit内クラスやらクロージャやら

今日も入門書のサンプルコードを写経しながらなんとなく理解した内容を書いていきます。

多分間違ってるんだろうな、でも追記で直せばいいんじゃ (参考にならなければすみません。)

 

 

/*

 ●モーダルビュー

 present を実行すると、新しい画面がオーバーラップするように画面遷移する。これをモーダルビューと呼ぶ。

 ViewControllerを移動せずに新しい画面、機能を呼び出しできる。なんでSegueと違って別のswiftファイルと値の受け渡しをせんでもいいし

 画面遷移に際した初期化とかもせんでいい これは便利 でもたぶんモーダルは単機能を有する画面(カメラやらアラートやら)のみを想定されてる気がする

 もう少し詳しくなったらちゃんと書く 場数ふんだらすぐわかる

12/4 同日追記 これアラート出す(その画面以外の操作を不能にする)事をモーダルと呼ぶだけで、Segueのオプションとして画面が下から出てくるモーダル遷移もあるらしい 混ざるな

>>>>>>>>>>>>>>>

 present(hoge, animater:true, completion: nil)

 >>>>>>>>>>>>>>>

 第一引数 hoge どの画面を表示させるかを指定。このプログラムだとインスタンス化させたimagePickerControllerを指定

 第二引数 animated:true 表示するときアニメーションをするかしないか

 第三引数 completion:nil モーダルビューの表示が完了した後で、追加で処理を行いたい場合に指示。なければnil

 

 

 ●UIActivityViewController 別のアプリにデータを飛ばしたいときにしたから出てくるあのポップアップ SNS投稿とかにつかう

 第一引数 シェアするコンテンツの配列を指定 第二引数 iOS標準として搭載されていないサービスを拡張する場合に指定。拡張しないならnilを指定

 

 ●UIKitクラスのデフォルト引数あるある おそら別クラスでも同じ名前の引数なら意味は共用のはず(知らずに書いてる)

 handler...そのメソッドを実行した際、任意の処理をクロージャーに入れておけば実行してくれる example. モーダルでダイアログを出して、各選択肢をUIAlertActionで定義するとき、インスタンスを生成する際の引数にhandlerをクロージャで記載すれば 選択肢をおしたときに任意の処理を行える(カメラ立ち上げたりSNS投稿をしたら)

 

 style... .defaultで通常、.cancelでキャンセル処理、.destructiveでデータが消える

destructiveって何に使うんだ...?同一インスタンスの中で保持している全データを空にするとかかな

 

 completion... そのメソッドを実行し、完了した際に任意の処理をクロージャーに入れておけば実行してくれる handlerとの違いはタイミング?

 

 ※UIKitのクラス一覧を書いてくれたQiita記事を見つけた 神かな?2018年の記事だから情報古いだろうけど大概そのままつかえる予感

 https://qiita.com/m-yamada1992/items/24064011779e43b52dc7

 

 

 クロージャ

 まとまった処理を定義できるデータ構造 算数で言うとこのかっこ算

 変数に格納すれば再利用が可能、引数として渡せる(handlerとして渡すとかがわかりやすい、ほかfor文の試行回数とか?)、型として定義することができる

 クロージャは名前や不要な情報をはしょって記述できるので、可読性、軽量化を望める汎用性の高いデータ構造

 >>>>>>>>>>>?

 {(引数) -> 戻り値の方 in

    処理

    return

 }

 >>>>>>>>>>>>

 

 クロージャ中が1行の時、returnを省略できる(暗黙的なreturn)

 引数がない場合、()の中はいらない 返り血もない場合() -> の両方の記載ごと飛ばせる

 sample// let closure = {print("hoge")}

 

 ちなみに変数に格納(代入)したら再利用できる。呼び出し方は 変数名()

 さらに、変数を定義するときの方としても扱うことが可能。この辺でようわからん...わかったらかく

 

 

 参照サイト https://tech.amefure.com/swift-closure#:~:text=Swift%E3%81%AE%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%B8%E3%83%A3(Closure)%E3%81%A8,%E5%80%A3%E3%81%A3%E3%81%A6%E8%A8%98%E8%BF%B0%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

Swift for文の書き方

さっきの記事に書き忘れた

 

PHPちょっと触ったときはforとforeachで違ったりしたんやが、Swiftもそうなのだろうか。ちょっと調べたらforEachというのがあるらしい。

いずれ使うことがあれば書き足しておこう。

 

/*

  for 文の書き方

  

  for 変数 in 開始値...終了値{

  //処理

  }

>>>>>>>>>>>>>>>>>>>>>>>

var hoge = [

    "apple",

    "banana",

    "grape"

]

 

for numb in 0...2 {

    var huga = hoge[numb]

    print(huga)

}

>>>>>>>>>>>>>>>>>>>>>>>>

 

 ※...を..<にすると、終了値を含まずに繰り返し処理を行う。

  for 変数 in 開始値..<終了値{

  //処理

  }

>>>>>>>>>>>>>>>>>>>>>>>

var hoge = [

    "apple",

    "banana",

    "grape"

]

 

for numb in 0..<hoge.count {

    var huga = hoge[numb]

    print(huga)

}

>>>>>>>>>>>>>>>>>>>>>>>>

  */

 

こんな基本的な構文さえ、本読んだり写経してるだけだと覚えてないものである。恐ろしい...(PHPPythonPowershellのうっすい記憶が邪魔をしてくる)

Swift メソッドの書き方、オプショナルの意味

文法もうろ覚えの状態で、本読みながらアプリを作っています。

触っている上で覚えておきたい事を、ソースコードのコメント欄に書きがち。

でも書きすぎてソースコードの視認性がめちゃくちゃ悪くなりました。

 

テキスト読めばいつでも再確認できるけど、自分の言葉で書き記すことで

本当に理解しているか/後から見て、本当に理解できていたかどうかが確認できるぞ。

 

たぶん間違っているかもしれないけど、自分なりの理解を書き記しておきます...

※間違ってるとわかったら追記で直していきます。おとなはウソつきではないのです。まちがいをするだけなのです...

 

 

/*

 Tips  Swift メソッド(関数

)の書き方

 

 func hogeHoge(_ huga:Int hogo:Str) -> Bool {

  return =

 }

  hogeHoge が メソッド名

 _ が ラベル、設定しない場合は"_"とかく ラベルによって引数を保管できる?

 huga が 第一引数 :Int が第一引数の型指定

 hogo が 第二引数 :Str が第二引数の型指定

 -> Bool が 戻り値の型宣言 この肩の通りの戻り値がこないとエラーおこす

 return = で代入される値が戻り値になる

 */

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

/*

 Tips オプショナル

 

 通常、宣言された定数、変数はnilを許容しない

 nilを許容するには 型宣言の後ろに?をつけてオプショナル型にする必要がある

 オプショナル型は値が空の場合はnilをだす

 

 ただし、オプショナル型の値は非オプショナル型の値と演算できない

 この場合、オプショナル型の定数/変数に!をつけることで、演算可能な状態にできる

 これをアンラップという ただしこうするとnilを許容できなくなるので、値が空だとエラーになる

 

 オプショナル型は条件式でも使える。要は値が入ってたらこっち、入ってなかったらあっち、と処理を分けられる

 nilのときはFalse それ以外はTrueを返すIf分をつかえばいい

 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

 var num : Int? //このときnumは空

 

 if let sum = num {

    print("sumは\(sum)です")

 } else {

    print("値が設定されていません")

 }

 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

 

 こう書くことで、下記3件のメリットが生まれる。これをバインディングとよぶ

 ①numがnilかどうか確認できる(宣言時はnilの変数が、処理の途中で値が入ったか確認できる)

 ②numがnilだったときの例外処理を行える

 ③numをsumという値に代入し、使用している変数を置き換えることができる(これにより、numはnilでないと可視化できる)

 

 他、型宣言時に?でなく!を使うことで、アンラップ不要で非オプショナル型と演算できるようになる。(厳密には演算時に勝手にアンラップされる)

 宣言時はnilだが、使うときには値が格納されていることがわかっている場合は、こちらを選んだ方がいい。 これを暗黙的なオプショナル型 と呼ぶ。

 なお、暗黙的なオプショナル型でも、値がnilでアンラップが必要なとき、そのまま使用するとエラーになってしまう。

  

 */

 

↑↑オプショナルはサムライエンジニアの記事を参照しました。ありがとうサムライエンジニア。フォーエバーサムライエンジニア。でも金勿体無いからスクールはNG

www.sejuku.net