[Swift]swiftログ(3)



alert dialog


例を見てみましょう
@IBAction func addButtonPressed(_ sender: UIBarButtonItem) {
        let alert = UIAlertController(title: "Add New Todoey Item", message: "", preferredStyle: .alert)
        var textField = UITextField()
        
        let action = UIAlertAction(title: "Add Item", style: .default) { action in
            self.itemArray.append(textField.text!)
            // 새로운 element를 추가한 뒤 반드시 reload를 해줘야 한다.
            self.tableView.reloadData()
        }
        
        //alert dialog에 textfield 추가
        alert.addTextField { alertTextField in
            alertTextField.placeholder = "Create new item"
            textField = alertTextField
        }
        
        //위에서 정의한 action을 dialog에 추가
        alert.addAction(action)
        
        //정의가 끝난 alertdialog를 현재 viewcontroller에 추가
        present(alert, animated: true, completion: nil)
    }

UserDefaultに関する小さな常識

  • UserDefaultはSingleton Patternによって作成され、Instanceを繰り返し作成しても同じ内容が呼び出されます.
  • UserDefaultsは、1つの値を取得したい場合でも、UserDefaults全体がロードされるため、最小限に抑える必要があります.アプリケーションのパフォーマンスに大きな影響を与えます.
  • Custom classをUserDefaultに入れると問題が発生します.Primitiveタイプまたは元のタイプのセットのみを使用する必要があります.
  • 」Table Viewにおけるユニット状態管理の注意事項


    Table Viewで再利用可能ユニットを使用する場合の注意点


    Table View Data SourceメソッドのtableView.DequeueReusableCellメソッドを使用してCellを整理すると、下にスクロールしてビューから消えたセルが再使用され、最初にこのリソース効率のために存在したのがReusableCellです.
    各セルに新しいUItableViewCellオブジェクトを割り当てる場合は、スクロール時に設定をリセットします(e.g.checked accersey).
    ビューから消えた瞬間にdealloce->が破壊されるからです.
    したがって、セルではなくセルを含むデータに基づいて設定を表示および維持する必要があります.

    NSCoderを使用してデータを保存する(レッスン246~248)

  • FileManagerは、ストレージパスを決定します.
  • PropertyListEncoder()クラスインスタンス、ローカルストレージにデータを書き込む
  • 注意!データ格納時にplistはJSON形式で格納されるため、格納するデータモデルはEncodableプロトコルを使用する必要があります.
  • 以降このデータをインポートする場合は、PropertyListDecoder()で読み込みます.このため、データモデルはEncodableとDecodableの組合せとして宣言される.
  • iOSのローカルデータストレージ


    For small datas

  • UserDefault:アプリケーションの使用時にユーザが設定したブール値の単純な情報を格納するために使用されます
  • Codable:情報は簡単ですが、Primitiveタイプ
  • ではありません.
  • Keychain:情報は簡単ですが、セキュリティ要件は高い(ユーザーパスワード、id、個人情報)
  • For big datas (Database solution)

  • SQLite:SQL推奨熟知者
  • Core Data:SQLiteと似ていますが、より強力なオブジェクト向けデータベース
  • Realm:Core Dataですが、高速で効率の高いフレームワーク
  • AppDelegateのプロパティへのアクセス


    (UI Application.shared.delegate as!AppDelegate).
    UIApplication.shared<-現在のアプリケーションオブジェクトを単一インスタンスモードで読み込みます.
    UIApplication.shared.delegate<-現在のアプリケーションオブジェクトのエージェント.AppDelegate!

    Core Dataの概念と使用方法


    Core Dataはsqlite dbベースのフレームワークであり、データを永続化コンテナに格納することができる.DBやAPIだけでなく、ローカルデータストレージのほか、さまざまな用途があります.
    Core dataはcontextを介してアプリケーションとpersistent storeを接続します.現在の情報の変化状態をcontextに適用し、必要に応じてcontextを適用します.save()が呼び出されると、現在のコンテキストの情報はコアデータに保持されます.簡単に言えばcontextはGitのstaging area,contextである.save()はcommitと理解できる.
    Good References
    https://zeddios.tistory.com/987<-概念と簡単な実践
    https://velog.io/@leeesangheee/Core-Data-%EC%82%AC%EC%9A%A9%ED%95%B4-CRUD-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0<-CURDの簡単な例

    個人リポジトリ、API、フレームワーク


    フレームワーク:開発時によく使用される機能を一度に提供し、フレームワークをそのままキャプチャするソフトウェア
    ライブラリ:機能タイプまたは用途別に定義されたAPIまたは関数の集合.
    API:プログラムとプログラムをつなぐブリッジ.
    フレームワークとライブラリの違い:コードを制御するのは誰ですか?
    ライブラリ:私はコードするとき、必要なときだけライブラリをインポートして、勝手に使います.
    フレーム:フレーム定義のルールに従ってコードを作成します.フレームワーク定義のルールは、正式なドキュメントで従う必要があります.

    Core DataのQuery(NSPredication)

    extension ToDoListViewController: UISearchBarDelegate {
        func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
            //create request by Explicitly declaring request type (제네릭스 사용해서 명시하라고)
            let request: NSFetchRequest<Item> = Item.fetchRequest()
            
            // make a query. More info at https://academy.realm.io/posts/nspredicate-cheatsheet/
            let predicate = NSPredicate(format: "title CONTAINS[cd] %@", searchBar.text!)
            request.predicate = predicate
            
            // 정렬 방식도 지정해줄 수 있음.
            let sortDescriptor = NSSortDescriptor(key: "title", ascending: true)
            request.sortDescriptors = [sortDescriptor]
            
            // Now, fetch the request to our context!
            do {
                itemArray = try context.fetch(request)
            } catch  {
                print("Error fetching data from context \(error)")
            }
        }
    }

    NSPredicate Cheatsheet


    https://academy.realm.io/posts/nspredicate-cheatsheet/

    ⭐️⭐️⭐️ Realm


    https://www.mongodb.com/realm<-MongoDB Realm公式サイト
    https://www.mongodb.com/docs/realm/tutorial/ios-swift/<-Reamswift公式ドキュメント
    https://github.com/realm/realm-swift <- RealmSwift GitHub
    https://velog.io/@yoonjong/Swift-Realm-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0->単純CRUD例

    」Deprecateの文法!


    @Persistedで置換@objc dynamic
  • @objc dynamic:Realmがアプリケーションの実行時に特定のデータ(propertyの値)を動的に変更できる
  • @Persisted:既存の@objcを@Persistedに動的に変更!両方を混用すると@objcダイナミック構成は無視されるのでPersistedを使いましょう!
  • リンクオブジェクトinit構文の変化


    class User: Object {
        @objc dynamic var _id: ObjectId = ObjectId.generate()
        @objc dynamic var _partition: String = ""
        @objc dynamic var name: String = ""
    
        // A user can have many tasks.
        let tasks = List<Task>()
    
        override static func primaryKey() -> String? {
            return "_id"
        }
    }
    
    class Task: Object {
        @objc dynamic var _id: ObjectId = ObjectId.generate()
        @objc dynamic var _partition: String = ""
        @objc dynamic var text: String = ""
    
        // Backlink to the user. This is automatically updated whenever
        // this task is added to or removed from a user's task list.
        let assignee = LinkingObjects(fromType: User.self, property: "tasks")
    
        override static func primaryKey() -> String? {
            return "_id"
        }
    }
    今、今
    class User: Object {
        @Persisted(primaryKey: true) var _id: ObjectId
        @Persisted var _partition: String = ""
        @Persisted var name: String = ""
    
        // A user can have many tasks.
        @Persisted var tasks: List<Task>
    }
    
    class Task: Object {
        @Persisted(primaryKey: true) var _id: ObjectId
        @Persisted var _partition: String = ""
        @Persisted var text: String = ""
    
        // Backlink to the user. This is automatically updated whenever
        // this task is added to or removed from a user's task list.
        @Persisted(originProperty: "tasks") var assignee: LinkingObjects<User>
    }
    

    Realmファイルの検索


    アプリケーションを起動すると、appdelegateにコードprint(Realm.Configuration.defaultConfiguration.fileURL)を入れると、絶対パスがコンソールに表示され、プレーヤーでcmd+shift+gを押してパスに移動します.realmファイルを開くといいです.

    Realmファイルの読み込み


    Realm Browserを使用します.realmファイルを開くと、次のメッセージが表示されます.

    このようなことを避けるためには、Realm BrowserバージョンのRealm Studioをこのリンクから直接ダウンロードと書くだけでよい.

    Chameleon Framework


    様々な色やコントラストを簡単に適用できるtextcolorのフレームワークです.
    リンク:https://github.com/wowansm/Chameleon/tree/swift5
    注意事項:swift 5以上でトランスフォーマーを使用する場合は、Podfileにブランチ名を正しく記入してください.
    pod 'ChameleonFramework/Swift', :git => ' https://github.com/wowansm/Chameleon.git' ,
    :branch => 'swift5'
    これによりpodが正常にインストールされます.

    」」Navigation bar colorを各ページに変更した場合


    通常、viewDidLoad()にコードを記述してナビゲーションバーの色を変更するだけでよいと考えられますが、実際に実行するとコードは動作しません.
    viewのロードは完了しましたが、ナビゲーションコントローラのナビゲーションスタックに現在の画面が表示されていない可能性があります.
    そのため、ViewControllerのライフサイクルでは、画面に表示される前のViewWillAppear関数を拡大し、色を変更する必要があります.
    💡 Tip. iOS 13からナビゲーションコントローラまで?navigationBar.BarTintColorではなくコントローラをナビゲートしますか?navigationBar.背景色

    Swift Access Levels Keywords


    次のキーワードを使用して、変数/関数のアクセスレベルを決定します.
    1.private:このクラスでのみ使用できます.
    2.fileprivate:同じファイル(i.e.同じ.swiftファイル)でのみ使用できます.
    3.内部:現在のアプリケーションでのみ使用できます.swiftで変数/関数が宣言された場合defaultは内部
    4.public:他のアプリケーションでも使用できます.Cocoapodsなどの他のアプリケーションで使用できる関数/変数を記述します.
    5.open:共通のアプリケーションと似ていますが、他のアプリケーションではサブクラスを上書きすることで変数/関数を変更できます.

    guard let VS if let


    動作に大きな違いはないのでConventionで推測すればいいです.
    Guard letは言ったように、絶対にnilが発生しないOptionalを開くために使われています.そのため,guard letのelse部分にfatalErrorのようなものを加え,現在の論理に重大な問題があることを開発者に知らせるためによく用いられる.
    これに対して、悪いプレイヤーは同じボタンを何度もクリックしたり、ストリームにnilが現れたりして、nilが現れてもあまり問題のない部分は主にif letを使用します.
    もちろんif letもguard letも同じ動作ができるのは重要な部分ではありませんが、この習慣でコードの毒性を高めることができると思います.