忍者ブログ
natsuの秘密基地です
はまり
はまり一件ごとのお話の流れです
カレンダー
03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
プロフィール
HN:
natsu
性別:
男性
趣味:
酒など
自己紹介:
ここに書かれていることはフィクションです。
ブログ内検索
アクセス解析
[1] [2] [3
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

最初、何がしたかったのかというと、
Pythonでバンドルを作り、それをObjective Cのメインバンドルから呼び出したかった。
っていうこと。

MVCのVCをObjective Cでつくり、Mの部分をPythonで作る。
んで、Mのところのコードの大部分がプラグインバンドル。
ってな感じが自分の夢だったんです。

 
で、結局のところはそれは出来ません。と。

 
方々あちこち調べたんだけども、ほんとにできないっぽい。
マニュアルにはpy2appでプラグインが作れるっぽいようなことが書かれてたけど。
結局は出来なかった。
それっぽいものが出来上がるんだけども、クラスが取得できなかった。
 
で、どうするかというと、
どっかの質問サイトで回答していたひと曰く、

「やめちゃいなよ。」

らしい。


みもふたも無いっす。


どうしてもやりたいなら、

「Objective Cで書いたバンドルでPythonコードをラッピングするといいよ。」

なんだって。
 
 
 
どんどん話が大げさになっていってる。

 
 
ファクトリーみたいなのを作ればいいんですよ。
Pythonで仕事するクラスをまず作って、
Objective CでそのClassとインスタンスを返すメソッドを持ったクラスを作ればよいと。
 
で、このバンドルを使う側は
Objective Cで作ったファクトリークラスをまず取得して、
その関数を呼び出して、
Pythonで作ったクラス、そのインスタンスを取得しちゃえばいいと。
 
 
結論から言うとこの方法でうまくいった。
 
 
 
 
 
 
興味があるかたは、適当に直して動かしてもらえればと。
動かないときは、動かなくても不思議ではないなと思ってください。
そういう人が作ってるんで。
 
 
デバッガでステップ実行やらなんやらしてたときに思ったんだけども、
ファクトリのクラスをインスタンス化するときに時間がかかってたので、
ここんとこは重いのかも。

Pythonオブジェクトの生成とPythonのオブジェクトのメソッド呼び出しは気にならなかった。
ファクトリはそう何度も何度も作り直さない方がいいんだと思う。
 
 
PR
複雑なデータ型はやり取りする気はなくて、
数値と文字列があれば足りると思う。
配列は渡せると便利かもしれないけど、
結局タブ区切り文字列とかでやっちゃうんだと思う。
 
オブジェクトはシリアライズして文字列で渡した方がいいと思う。
 
とりあえず、数値はやり取りできそうなので文字列をやり取りする方法を探ってみる。




 
-(NSString *)stringTest:(NSString *)s1 str2:(NSString *)s2 intNumber:(int)i
 
的なメソッド、
 
def stringTest_str2_intNumber_(self, s1, s2, i)
 
で実験。
動きは受け取った引数を全部連結して返す。
 
文字列返しで、文字列、文字列、数値なので
signature='*@:**i'でトライ。
なんか":"は最初の一個でいいのね。
この辺の法則はよくわかんないけど。



 
Pythonのメソッド内でprintすると、
そのままコンソールに出してくれるのはとてもうれしい。
s1=@"あいう" s2="かきく"を出力したら、
 
\340\363_p\377
\340\363_p\377
 

ばけらった。




普通にNSStringわたすってことは、
文字列を渡すというよりオブジェクトを渡すということなんだと思う。
NSStringはUTF16だっけ。その関係かも。
なので[s1 UTF8String], [s2 UTF8String]で渡すと、
 
あいう
かきく
 
OK




 
連結した文字列を受け取り、これは char * なので、NSStringに変換

NSString *result = [converter stringTest:[s1 UTF8String] str2:[s2 UTF8String]  intNumber:1];
NSString *s3=[NSString stringWithCString:result encoding:NSUTF8StringEncoding];
NSLog(s3)
 


2010-05-08 15:29:15.831 Currency Converter[10359:903] あいうかきく1
 
OK
 
 

実験してて気づいたけど、signature='@@:**i'でNSStringが受け取れた。
NSString *result = [converter stringTest:[s1 UTF8String] str2:[s2 UTF8String]  intNumber:1];
NSLog(result);
 
 
2010-05-08 15:31:01.083 Currency Converter[10408:903] あいうかきく1
 

 
PyObjC側で変換してくれているんだと思った。
 

参考
Type Encodings




Copyright (C) 2010 NEST,
All right Resieved.*Powered by ニンジャブログ *Designed by にこるん  / 忍者ブログ / [PR]