1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Pythonista3Advent Calendar 2022

Day 14

Pythonista3 のメインヒロイン。objc_util での実装の流れ(実装事例随時更新)

Last updated at Posted at 2022-12-13

この記事は、Pythonista3 Advent Calendar 2022 の14日目の記事です。

一方的な偏った目線で、Pythonista3 を紹介していきます。

ほぼ毎日iPhone(Pythonista3)で、コーディングをしている者です。よろしくお願いします。

以下、私の2022年12月時点の環境です。

.log
--- SYSTEM INFORMATION ---
* Pythonista 3.3 (330025), Default interpreter 3.6.1
* iOS 16.1.1, model iPhone12,1, resolution (portrait) 828.0 x 1792.0 @ 2.0

他の環境(iPad や端末の種類、iOS のバージョン違い)では、意図としない挙動(エラーになる)なる場合もあります。ご了承ください。

ちなみに、model iPhone12,1 は、iPhone11 です。

宝探しとか、もしくは脱出ゲームのような

Pythonista3 では用意されていないiOS の機能を呼び出したい場合、objc_util を使います。

objc_util — Utilities for bridging Objective-C APIs — Python 3.6.1 documentation

objc_util モジュールは、Python から Objective-C の API を利用するための「橋渡し」をしてくれます。

ctypes と Objective-C ランタイムライブラリに基づいて、objc_util は既存の Objective-C クラスを、Python のメソッド呼び出しを対応する Objective-C メッセージに自動的に変換する方法で「ラップ」することを可能にします。

Objective-C(もしくは、Swift)のコードサンプルを参考にPythonista3 で実装ができるようになります。

私はiOS アプリ開発も、Objective-C・Swift も普段は書かないので、毎回検索の繰り返しです。

手順や確認点

objc_uitl を使い始めると「Python を書いているはずなのになんだ、これは?」と、定食屋で割り箸を使ってフレンチのフルコースを食べてる感覚になります(ぜんぜん違う)。

お気持ちも含めた、流れです。

余裕ライン。ぜんぜんあるあるのやつ

  • 既にobjc_util へ取り込まれているか
    • Documentation を読む
    • from objc_util import * でinspector を確認
      • module を直接見に行ったりもします
        • [Python Modules][Standard Library(3.6)][site-packages]objc_util.py
        • __all__ に入ってない、Documentation に書いてない可能性もあり

CGRect からのCGPoint, CGSize を再実装しがちです。

UIColor も実は実装されています(inspector で確認できます)。

Swift で表示されがちですが、Objective-C にしましょう。

  • Class か?

    • ObjCClass で呼び出してみる
      • エラーの場合は、Framework は何かを確認
  • Framework か?

    • load_framework でFramework を呼び出す
    • 〜Kit, 〜View などで分かれてFramework が存在していないか

ObjCClassload_framework だけで、済む時の嬉しさ。

おっ、あ。なるほどですねぇ

  • Enumeration Case

    • Apple Developer Documentation のDeclaration にある整数を指定
      • だいたい整数の意味を忘れるので、変数で対象の名前に
      • Objective-C だとキャメルケースで長い
      • Swift だと. で区切られている
  • Instance Method

    • objc_util のオブジェクトから素直に呼び出せる
    • .hoge_fuga_ となる引数の確認の方が大事
      • Swift だと名称が変わっていることの方が多いので注意
  • Instance Property

    • objc_util で呼び出したオブジェクトから持ってくることが多い
      • print して確認
    • 要素を絞りきれていない可能性があるので、Apple Developer Documentation のSee Also から、それっぽいのを探す
  • Swift のoverride

    • override するものがないので、override のつもりで普通に実装

「Swift やObjective-C 書いている人ならわかるんだろうな」と、なんとなく考えつつ、地道ながらも調べて出てきたものでなんとかなる。

(正座をしだす)

ここら辺となると、検索したサイトでは普通に呼び出して普通に実装(Swift やObjective-C なので当たり前)しています。

前処理の変数や引数情報が、日本語の解説では皆無な場面も出てきます。

一つの希望として、Xamarin のドキュメントで調べる手もあります。

日本語ドキュメントは機械翻訳がメインと考えられるので、避けるが吉でしょう。

Xamarin.iOS - Xamarin | Microsoft Learn

また過去に1度だけ(何かは忘れましたが)、React Native のGitHub リポジトリのissues から見つけて解決したこともありました。

Issues · facebook/react-native

しれっと、ctypes モジュールを使う場面も出てきます。もうPython を書いているのか何なのかわからなくなります。

ctypes --- Pythonのための外部関数ライブラリ — Python 3.11.0b5 ドキュメント

Function呼び出し例.py
Function = c.Function
Function.argtypes = []
Function.restype = ctypes.c_void_p

実装事例

事例は、Pythonista3 Advent Calendar 2022 で更新していきます。

(以下更新予定: 対応リンクを貼り付ける予定です)

次回は

objc_util モジュールの実装手順と、print 出力による確認方法について紹介しました。

次回より、私のobjc_util を使った実装を紹介していきます。

ここまで、読んでいただきありがとうございました。

せんでん

Discord

Pythonista3 の日本語コミュニティーがあります。みなさん優しくて、わからないところも親身に教えてくれるのでこの機会に覗いてみてください。

書籍

iPhone/iPad でプログラミングする最強の本。

その他

  • サンプルコード

Pythonista3 Advent Calendar 2022 でのコードをまとめているリポジトリがあります。

コードのエラーや変なところや改善点など。ご指摘やPR お待ちしておりますー

  • Twitter

なんしかガチャガチャしていますが、お気兼ねなくお声がけくださいませー

  • GitHub

基本的にGitHub にコードをあげているので、何にハマって何を実装しているのか観測できると思います。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?