忍者ブログ
natsuの秘密基地です
はまり
はまり一件ごとのお話の流れです
カレンダー
04 2024/05 06
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 31
プロフィール
HN:
natsu
性別:
男性
趣味:
酒など
自己紹介:
ここに書かれていることはフィクションです。
ブログ内検索
アクセス解析
[4] [5] [6] [7] [8] [9] [10] [11] [12] [13
×

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

複雑なデータ型はやり取りする気はなくて、
数値と文字列があれば足りると思う。
配列は渡せると便利かもしれないけど、
結局タブ区切り文字列とかでやっちゃうんだと思う。
 
オブジェクトはシリアライズして文字列で渡した方がいいと思う。
 
とりあえず、数値はやり取りできそうなので文字列をやり取りする方法を探ってみる。




 
-(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


PR
オブジェクトをインスタンス化してメソッドを呼び出すところまではうまくいった。
例えば、一番シンプルな、関数の形。
リターンしないようなメソッド。つまり、戻り値の型はvoid。
引数も受け取らない。
 
def test(self)
 
こういうのは普通に呼び出せる。
ちなみに、引数の一つ目は必ずselfが渡されてくる。
これは暗黙に渡されるので呼び出し時は必要ない。
だから、

[testObject test]

って呼び出せば、勝手にselfがやってくる。
この場合はtestObjectがselfになって渡されてくる。
 
 
 
でも、こういう奴。
 
def setRate_(self, newRate):
 
Objective C風にいうと、

-(void) setRate:(float)newRate;

とかだと呼び出しがうまくいかない。
 
 
 
なんか、
@objc.signature
objc.selector
でメソッドの宣言をしなきゃいけないっぽい。
 
 
 
私は@objc.signatureでうまいこといかなかったんで、
objc.selectorを使ったけど、@objc.signatureのほうが新しいらしい。
で、さっきのsetRateだと、
 
def setRate_(self, newRate):
self._rate = newRate
setRate_ = objc.selector(setRate_, signature='v@:f')
 
っていう感じの定義になった。

だれがどうみても、
signature='v@:f'がくせもの、っていう雰囲気が伝わってくる。

ちなみにself._rateのアンダースコアは何も考えずにつけてるんで、
(意図的には)意味は無い。
 
 
 
どうやら、
 
[v]oidの戻り値
@第一引数はオブジェクト(self)
:区切り(Objective Cで見慣れてるあれ)
f第二引数はfloat
 
っていう意味らしい。
じゃあ、
def getTrue(self, intValue, objectValue)
return true
だと、
B@:i:@
なのか。
試してないけど。

っていうか、Pythonにtrueなんてあったか?


 
ちょっとこの辺はまた試してみるよ。ってことで。
文字列の扱いが気になるし。
でも、それはまた明日以降に。
今日は背中がぐきっ、ってなってパソコン打つのがちょっと辛い。
すこし横になろう。実は今日はなんも出来てない。 
 
 
ちなみに、変数名の_rateのアンダースコアはなんも考えずにやってたけど、
関数名のアンダースコアは重要らしい。':'の代わりなんだって。

-(void) addURL:(NSString *)url fileName:(NSString *)name;

だったら、

def addURL_fileName_(self, url, name);

みたいな。
 
さてと。なにをするのがいいのか。というところで。
Currency Converterのチュートリアルで作ったものを基にして、
なんかすれば、何となく何をどうやればどうなるのかというのが、
おぼろげにも解るような気がした。
 
 
要するにCurrency Converterです。
 
 
とりあえず目標として、MVCでしたっけ、
あれのMをPythonのコードで置き換える、というのは妥当だと思う。
目標としてね。
 
 
自分、ひとによるとMらしいしね。
 
 
つまるところ、Converter.mとConverter.hが、
Converter.pyになればOK。
 
 
ただまあ、PyObjC。
サンプルかきあつめてね、いろいろ見る限りでは初期化がいるみたいなんですねぇ。
なんか、main.pyをたてて、そこでいろいろimportするらしい。
ちなみに自分の使いたいクラスもここでimportしちゃえばいいっぽい。
私の場合はimport Converterって最後の方でいっちゃえばいい。
 
で、そのmain.pyをObjective Cのコードのどっかで走らせればいい。
私はmain()から初期化関数よびだし!でやっちゃったよ。
 
 
ただなんか、ね。その初期化でうまくいかない。
で、新規でプロジェクトたてて、初期化のみを行うプログラムを作ると、
こいつは初期化がうまくいく。
 
なんでだってことで、Currency Converterをまた一から作り直してみる。
ただし、Converter.pyとPyObjCの初期化は最初から入れておく。
 
作ってくと初期化が失敗するフェイズに突き当たった。
 
Currency Converterやってみた人はわかると思うけど、
alloc initしたのにreleaseしないコードを書かせるところがあるでしょ。
で、その後ガベージコレクタ設定を有効にするくだり。
 
 
ガベージコレクタがナウいんだぜ。HAHAHA。なとこ。 
 
 
ここで落ちますよ。と。
 
 
 
 
あと、初期化がうまくいってもコンソールにwarningがでまくり。
ターゲットを10.6から10.5にすると落ち着いた。
まあ、10.6でやる理由もいまんとこないし。
 
ガベージコレクタと10.5が
昨日のラッキーワード・ラッキーナンバーだったみたいだということに、
日付が変わる前に気づいた昨日という日。
 
 
ブログのデザインがまだいい加減なんで、コードはデザインが決まったら貼るということで。
今のじゃ見にくくなる気がする。
 
3列は譲りませんよ。あこがれだったもんで。
 
まあ、まだ自分の今やってることも落ち着いてないんで、またおいおい。
まだだれも見てないし、大丈夫大丈夫。
 


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