Swift:NSTreeControllerのメインを通過

ようやくNSTreeControllerのメインFileNodeの主要部分を通過しました。

Obj.Cをほとんどそのまま使っているのであたり前なのですが、それなりに引っかかってしまいました。問題になった箇所と対処方法は次の通りでした。最終的にこれでいいかどうか?

1. SwiftからObj.Cを参照するときの注意したいこと。

  • MesaClipper-Bridging-Headerに#import “FileNode.h”を追加する。
  • var fNode  = FileNode()でObj.Cと関連づける。
  • var wArray:[AnyObject] = fNode.CallChildren(mcBaseFolderPath)のようにObj.Cメソッドを実行する。
  • Obj.Cからは、Swiftの変数が参照できるが、SwiftからはObj.Cの変数の参照ができない(?)ようだ。

2. Obj.CからSwiftを参照するときの注意したいこと。

  • Obj.Cのclass(.m)に#import “MesaClipper-Swift.h” を組み込む。MesaClipper-Bridging-Headerでないことに注意。
  • MesaClipper *Mesa = [MesaClipper new];でSwiftと関連づける。
  • Swiftの変数を参照するとき、if ([path isEqualToString:Mesa.mcBaseFolderPath]) { のように記述する。
  • NSArrayのarrayByAddingObjectがおかしい。コンパイルエラーは出ないが、値が配列に入らない。
  • Obj.CからSwiftの変数を変更できない。すべて試していないが、少なくも配列は変更できなかった。
  • Obj.Cの変数はそのclassに定義したものをメソッドで引数としてSwiftに渡すようにすれば、Obj.CからSwiftに値を引き渡せる。

-(NSMutableArray*)CallChildren:(NSString*)filePath
var wArray:[AnyObject] = fNode.CallChildren(mcBaseFolderPath)

  • 受け渡した配列は、var filepath:String = wArray[inx] as Stringのように書けば意図通りになる。
  • SwiftとOjb.Cとの間で、Swiftで定義したグローバル変数を受け渡しでき、参照・変更のいずれもできれば、上記の問題は解決できるかもしれない。

3. nil・・・本当にわかっていないの一言。

OK if xbTreeCont.selectionIndexPath == nil { return }
OK if !xbTreeCont.selectionIndexPath { return }
NG if xbTreeCont.selectionIndexPath == nil! { return }

4. それでも残っている問題:

  • Obj.Cでは、NSTreeControllerの初期設定をapplicationDidFinishLaunchingの中で行っていました。

self.root = [[FileNode alloc] initWithPath:NSHomeDirectory()];
NSString *wFilePath = [NSHomeDirectory() stringByAppendingFormat:@”/Desktop/MesaClip”];

self.root = [[FileNode alloc] initWithPath:wFilePath];

  • Swift側に書き直したいのですが、self.root、つまり、@property (nonatomic) FileNode *root;の定義のしかたがわかりません。
  • また、3行目のinitWithPathも基本的な問題として残っています。
Advertisements