« ◇したたか;自分で言うかい? | トップページ | ◇象は水が飲みたい;型名でインスタンスを指す »

メモ:SwiftUI基本

メモ

 SwiftUIの基本コード

SwiftUIの超単純コードを示します。
ファイルはContentViews.swiftです。

import SwiftUI
struct ContentView: View {
   // @Stateは変更をモニターする指定です。画面に反映されます。
   @State private var x:Int=0;
   // View{...}内には動作記述は置けません、View要素をただ1個だけ置きます。
   var body: some View {
      // Viewを縦に並べます。要素の切れ目は;です。
      VStack {           
         // Buttonを押した動作はaction:{...}に書きます                         
         Button("call ",action: { self.x+=1 });   
         // \(...)に変数を置けば文字列として展開されます
         Text("Hello, world! \(self.x)").padding()
         }
      }
   }
struct ContentView_Previews: PreviewProvider {
   static var previews: some View {
      ContentView()
      }
   }

右のような表示となります。
ボタンを押すと数値カウントアップが行われ、画面に反映されます。

Xcodeでは円マークと逆スラッシュは別になります。
エディタで作成したコードを入れる場合注意が必要です。文句をいっても仕方ありません。Macは技術ではなく宗教です。
Macでは逆スラッシュはOption-円マークで入ります。
deleteはFn-deleteです。
Macは字を入れるのが大変です。

 HTTPS/POSTクライアント

HTTPSでPOSTする超単純例を示します。

この例ではサーバをxx.xx.xx.xxとしています。
サーバが自己認証であってもつながるようにしています。細かい説明は後日追加します。
このプログラムはJSON{"number":"カウンタ値"}を送り、戻り値を画面に表示しています。
対向相手はjsonによるbodyのnumber値を読み込み、json{"result":"OK-読み込んだ値"}を返します。これも後で追加します。

import SwiftUI
struct ContentView: View {
   let session = URLSession(configuration: .default,
                            delegate: AllowsSelfSignedCertificateDelegate(),
                            delegateQueue: nil)
   @State private var result:String=""
   @State private var count:Int=0
   var body: some View {
      VStack {
         Button("call ",action: { sendPOST() });
         Text("Hello, world! \(self.result)").padding()
         }
      }
   func sendPOST(){
      self.count += 1
      let param:[String:Any] = ["number":String(self.count)]
      let body:Data = try! JSONSerialization.data(withJSONObject: param,options:[])
      let url = URL(string: "https://xx.xx.xx.xx")!
      var request  = URLRequest(url: url)
      request.httpMethod = "POST"
      request.httpBody   = body
      let task = session.dataTask(with: request) { (data, response, error) in
         guard let data = data else { return }
         do {
            let res:[String:Any] = try JSONSerialization.jsonObject(with: data, options: []) as! [String : AnyObject]
            print(res)
            self.result=res["result"] as! String
            }
         catch let error {
            print(error)
            }
         }
      task.resume()
      }
   }
struct ContentView_Previews: PreviewProvider {
   static var previews: some View {
      ContentView()
      }
   }
class AllowsSelfSignedCertificateDelegate: NSObject, URLSessionDelegate {
   func urlSession(_ session: URLSession,
                   didReceive challenge: URLAuthenticationChallenge,
                   completionHandler: @escaping (URLSession.AuthChallengeDisposition,
                                                 URLCredential?) -> Void) {
       let protectionSpace = challenge.protectionSpace
       guard protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust,
             protectionSpace.host                 == "xx.xx.xx.xx",
             let serverTrust = protectionSpace.serverTrust else {
          completionHandler(.performDefaultHandling, nil)
          return
          }
      completionHandler(.useCredential, URLCredential(trust: serverTrust))//許可
      }
   }

|

« ◇したたか;自分で言うかい? | トップページ | ◇象は水が飲みたい;型名でインスタンスを指す »