投稿者: itkuma

  • Swiftのprotocolについて調べてみました

    protocolは、特定のタスクや機能に適したメソッド、プロパティ、その他の要件の設計図を定義します。とのことです。

    設計図の定義ということですが、プロパティ名は作れても、値は設定できません。メソッド名は作れても処理を書くことはできません。値の設定や処理を書くことは、protocolに準拠したclass、struct、enumでしかできません。

    また、継承はclassしかできません。protocolの場合は準拠というようです。

    共通の要件を設定しようとしたとき、struct、enumではprotocolを使うしかありません。

    ところで、classでは値の設定や、処理を書くことができるので、どの継承部分の設定や、処理を引き継いでいるか管理するのに大変そうです。

    「何代前のご先祖様はこんなことがこんだけできたけど、お前はできないんだったら、変更しておけよ!」

    って叱られそうです。

    その点、protocolは準拠させるときに具体的に要件を設定すればいいので、

    「出来そうなことを書いとくから、後はどんなふうにどれだけできるかはその都度設定してね!」

    みたいな軽い感じがします。

    さらに、protocolは型として認識されるので、funcの引数に設定できます。例えば、

    protocol PersonProtocol {
    	var name: String {get set}
    }
    
    //protocol PersonProtocol に準拠したprotocol AdultPersonProtocolを定義します
    protocol AdultPersonProtocol: PersonProtocol {
    	var job: String {get set}
    }
    
    //protocol PersonProtocol に準拠したstruct PersonAを定義します
    struct PersonA: PersonProtocol {
    	var name: String
    	init(){
    		name = ""
    	}
    }
    
    //protocol AdultPersonProtocolに準拠したstruct PersonBを定義します
    struct PersonB: AdultPersonProtocol {
    	var name: String
    	var job: String
    	init(){
    		name = ""
    		job = ""
    	}
    }
    
    //struct PersonAを実装したpersonAを定義します
    var personA = PersonA()
    personA.name = "子供店長"
    
    //struct PersonBを実装したpersonBを定義します
    var personB = PersonB()
    personB.name = "大人店長"
    personB.job = "サラリーマン"
    
    //ここでprotocol PersonProtocolをfuncの引数personの型に設定します
    func printName(_ person: PersonProtocol) {
    	//protocol PersonProtocolのプロパティnameに設定された値を表示します
    	print(person.name)
    }
    
    printName(personA)
    //子供店長
    printName(personB)
    //大人店長  

    こんな感じです。protocolのAdultPersonProtocolはPersonProtocolに準拠しているので、PersonProtocol型でもあります。ですから、この場合の引数として有効です。

  • Swiftのclassとstructについて調べてみました

    結論としては、特にこだわりが無ければ、structを使う方がよいようです。

    classの継承を使いたいときや、Object-Cと連携させたいときはclassを使わないといけないようです。

    参照渡しを利用したいとき。つまり、

    struct TestStruct {
    	var sampleStruct: String 
    	init(){
    		sampleStruct = ""
    	}
    }
    
    class TestClass {
    	var sampleClass: String 
    	init(){
    		sampleClass = ""
    	}
    }
    
    var testStruct = TestStruct()
    var testClass = TestClass()
    
    testStruct.sampleStruct = "Hello"
    testClass.sampleClass = "Hello"
    
    var ts1 = testStruct
    var ts2 = testStruct
    var tc1 = testClass
    var tc2 = testClass
    
    ts1.sampleStruct = "なんでやねん"
    tc1.sampleClass = "なんでやねん"
    
    print("structは値渡しなのでts2.sampleStructは\(ts2.sampleStruct)のままです。")
    //structは値渡しなのでts2.sampleStructはHelloのままです。
    print("classは参照渡しなのでtc2.sampleClassは\(tc2.sampleClass)に変わります。")
    //classは参照渡しなのでtc2.sampleClassはなんでやねんに変わります。
    

    上記のように、変数testStruct、testClassに実装し、プロパティtestStruct.sampleStruct、testClass.sampleClassに”Hello”を代入後、変数ts1、ts2に変数testStruct、tc1、tc2にtestClassを代入し、プロパティts1.sampleStruct、tc1.sampleClassを”なんでやねん”に変更した時、

    structの場合、ts2.sampleStructは”Hello”のままですが、

    classの場合、tc2.sampleClassは”なんでやねん”に変わります。

    ということで、プロパティの値を変更したら、他のも変更させたいときはclassを使うようです。

  • SwiftUIのアプリはどこから始まるのか調べてみました

    XCodeで作成するプロジェクトでは@main attributeがあるstructから始まります。

    import SwiftUI
    
    @main
    struct MyApp: App {
        var body: some Scene {
            WindowGroup {
                ContentView()
            }
        }
    }
    

    iOSを対象にしたSwiftUI Interfaceではこんな感じです。下記のファイルと合わせると、地球マークの下に「こんにちは!」と表示されたアプリが出来上がりです。

    import SwiftUI
    
    
    struct ContentView: View {
        var body: some View {
            VStack {
                Image(systemName: "globe")
                    .imageScale(.large)
                    .foregroundStyle(.tint)
                Text("こんにちは!")
            }
            .padding()
        }
    }
    
    
    #Preview {
        ContentView()
    }

    こんな感じです。

  • PowerApps PDFビューアーを触ってみました

    PowerAppsには、PDFを表示する機能があります。

    はじめはPowerAutomateで下記の関数を使い、帰ってきた、バイナリデータをSet関数で変数に代入し、その変数をPDFViewerのDocumentプロパティにセットし、PDFを表示させていたのですが。

    dataUri(base64ToBinary(body('ステップ名')?['$Content']))

    PowerAppsだけでも、データでデータの追加 コネクタでBoxを追加すると、Box.GetFileContent(“Box.File.Id“)が使えるようになり、Set関数で変数に代入し、その変数をPDFViewerのDocumentプロパティにセットすれば表示できますした。こちらの方が簡単なので、今はこの方法を使っています。

  • PowerApps Launchを触ってみました

    自作アプリから別の自作アプリへ移動する時Launch関数を使います。

    Launch("url")

    urlにparameter &web=1をつけるとブラウザーで開くことができます。

    Launch("url&web=1")

    Teams内のPowerAppsで作成されたアプリを参照する場合、一度チャネルのタグに登録し、チャネルに認識させないと、アプリオーナー以外のチームメンバーが参照できません。タグ登録した後、タグを削除し、Teams上にアプリ登録し、そのurlを取得し、Launchのparameterとして設定すればアプリオーナー以外のチームメンバーも参照できます。

  • PowerApps Patchを触ってみました

    PowerAppsでJSONデータをテーブルにして、レコードの内容を変更して、テーブルに反映させる。

    まずはJSONの簡単なサンプルを変数_JSONtextにセットします。

    Set(_JSONtext,"[{""A"": ""A1""},{""A"": ""A2""}]")

    ParseJSON関数を使いコレクション_tableにセットします。この時ClearCollectionを使うのが味噌です。Patch関数の第一引数はコレクションなので、単純にSet関数を使ってしまうと、_tableを参照できませんでした。

    ClearCollect(_table,ForAll(ParseJSON(TextBoxJSONSample.Value),{A:Text(ThisRecord.A)}))

    _tableをGallary1のItemsにセットします。

    Gallary1でレコードをSelectされたらレコードの内容を反映させるFormを作成します。FormのDataSourceに_tableをセット、ItemにGallary1.Selectedをセット、DataCardを追加し、その中にTextBox2をセットし、ValueにThisItem.Aをセットします。これでGallary1で選択したレコードのAがTextBox2に表示されます。

    TextBos2の内容を変更し、その変更を_tableに反映させるのにPatch関数を使います。

    Patch(_table,First(Filter(_table,A = Gallery1.Selected.A)),{A: TextBox2.Value})

    この第二引数First(Filter(_table,A = Gallery1.Selected.A))でわかるように、レコードを特定する必要があります。JSONデータを作成するときには重複しないデータをもつプロパティを設定する必要があります。

    コレクションをJSONデータにします。

    Set(_JSONtext,JSON(_table))
  • 初めての金継ぎ

       初めての金継ぎ

     パートナーのお気に入りの箸置きが割れま

    した。しばらく放置されていたのですが、ど

    うやら金継ぎをして欲しそうなそぶりです。

    金継ぎはやったことがないし、そもそも漆を

    どこで手に入れたらいいのかわかりませんで

    した。とりあえず東急ハンズへ行ってみると、

    売ってました。漆はそんなに高くはなかった

    のですが、金継ぎする金泥と言われるものが

    結構値が張るものでした。代替品として、真

    鍮泥があるそうですが、東急ハンズにはあり

    ませんでした。ネットを調べると売っていた

    ので買い入れました。

     まずは接着するための麦漆作りです。薄力

    粉、水、生漆で作ります。薄力粉を練って耳

    たぶぐらいの硬さになったら、水に入れて揉

    み澱粉を抜きます。はじめは溶けてしまうん

    じゃないかと心配でしたが、逆に固くなりま

    した。それに生漆を混ぜていきます。麦漆が

    糸を引く位が良いそうですが、なぜか焦って

    しまい、糸を引く前に接着に使ってしまいま

    した。筆で塗るようなことを書いてあったん

    ですが、固くて(当然です。気が早すぎるの

    です。)爪楊枝で接着面になすりつけて、ぐ

    いと接着させてみたら、なんとなくひっつき

    ました。そして二週間放置しました。結構し

    っかりと接着できたように思います。次に砥

    の粉、水、生漆で錆と言われるもので、小さ

    な欠けを埋めました。そしてまた二週間放置

    します。そして下地に生漆を塗って二週間放

    置します。そして黒漆を塗って真鍮泥を蒔く

    作業の時、3時間置いたら乾きすぎました。

    真鍮泥がうまくつきませんでした。紙やすり

    で削って(これができるから失敗しても安心)

    もう一度。今度は黒漆を塗って30分ほどで

    真鍮泥を蒔き、3時間(半日以上おいたほう

    が良かったかもしれません。)ほど放置しま

    した。はみ出た部分は水洗いで取れました。

    いよいよ最後の透漆で固める作業です。生漆

    を練って練って、白濁が消えるくらいになっ

    たところで、真鍮泥を蒔いた部分に塗りティ

    ッシュですぐに押さえるようにして余分な漆

    を取ります。なんとなく金継ぎらしいものが

    出来上がりました。パートナーも初めてにし

    ては上出来きと褒めてくれました。

     ちなみに漆を塗る時の筆ですが、使い終わ

    った後は油で洗って、さらにテレピンで油を

    洗いとり、乾かすとありましたが、テレピン

    の購入をパートナーに断固拒否され、代わり

    に、食器洗い洗剤を使いました。最後に水洗

    いをして乾かして何度も使いました。また、

    真鍮泥を蒔く時真綿ではなく、化粧用の筆を

    使いました。

  • 固定電話

       固定電話

     私の家には固定電話はありますが、ほぼ使

    っていません。私の母と、パートナーの両親

    と電話する時にしか使っていません。そもそ

    も、そのためにしか置いていません。母は携

    帯電話やタブレットを使おうとは思わないら

    しい。どう使っていいかわからないし、仲の

    いい人からも固定電話で連絡が来るとのこと。

    ネットで調べるよりテレビのコマーシャルか

    ら情報を得ています。歳をとるとそうなるの

    だろうか。でも年配の方でも携帯やタブレッ

    トを使っている方もいらっしゃいます。ただ

    お話を聞くと、カメラとしてお使いになって

    いたりします。チャットはよくわからないか

    ら、娘さんに見せてもらうらしいです。使い

    方も娘さんに聞いて使っているらしいです。

    教えて貰えば使えるのだなと思いましたが、

    教えて欲しい時にそばにいないと、使わずに

    そのまま放置という絵面が見えてきます。そ

    んな絵面を想像すると、母世代がいる限り固

    定電話はなくならないだろうなと思います。

  • たずね猫のチラシ

       たずね猫のチラシ

     近所のさくら猫の一匹が失踪して、一週間

    になりました。お世話している方によるたず

    ね猫のチラシがはられ出しました。そこで初

    めて気がついたのですが、相棒の猫の名前に

    小さいツが入っていました。今まで小さいツ

    をいれずに名前を読んでいたので、申し訳な

    く思い、猫に謝り、呼び方を変えるようにし

    ています。しかし、猫のそっけない態度は変

    わらず、チラ見するだけです。気にしてなか

    ったようです。それとも呆れられたのかもし

    れません。どちらにしても、態度は変わりま

    せんが、正しいと思われる名前で呼ぶように

    しています。人間もニックネームと言ってい

    ろいろ読み方を変える場合もあるので、それ

    ほど気にすることはないのかもしれません。

  • 梅雨2024

       梅雨2024

     今年の梅雨入りは例年より遅いらしい。梅

    雨入りが遅いからといって、梅雨明けが遅く

    なるかというと、そうではないらしく、七月

    の中旬までには明けるようです。また、期間

    が短いからといって雨量が少ないかというと

    そうでもないらしく、逆に多かったりするよ

    うです。なので今年は雨による災害に注意が

    必要とのことです。気をつけます。