2014年7月24日 星期四

[Objective-C]將自製物件轉成 NSData 與從NSData轉回原物件

由於最近工作需求有用到NSUserDefaults來做資料的儲存,
本來以為把平常用的NSMutableArray轉成NSArray就可以騙過她塞進去,想不到出現錯誤訊息。
說我自製的物件是non-property的,所以不給存。 囧rz

survey了一些資料後發現,如果想存的話,通常是建議先轉成NSData,
當然(NSData *)這招我try過了,當然不行。 XD

從結果來看是因為,要轉成NSData 轉的過程要讓xcode知道要用甚麼方式轉,反之亦然,從NSData轉回來時要隻到對應的型態是什麼才有辦法encode回來。

簡單來說,必須要在自定義的物件設定decode與encode的方式。
實作:
-(void) encodeWithCoder: (NSCoder *)coder{

  //self.property 換成你自定義的property的名字,例如Name,UserID
  [coder encodeObject: self.property forKey: @”property”];
  //其它的property以此類推
}
可以讓妳的物件成功傳成NSData

如果還要轉回來的話(有人不轉回來的嗎。XD)
就必須實作
- (id)initWithCoder: (NSCoder *)decoder{
  if(self = [super init]){
    self.property = [decoder decodeObjectForKey: @“property”];
    //以此類推。
  }
}

看到沒有中文的資料,就順便做個筆記,有問題也歡迎大家多多指教。 xD

2014年7月1日 星期二

[Swift]Objective-C 和swift混合模式(mix)

swift問世後,想要改寫swift但是又礙於很多慣用的工具和class都是Objective-C版的,
重寫又太麻煩,幸好有一種叫混合模式的東西。

可以讓你沿用原本寫的工具,然後透過bridge自動變成swift的格式使用。
(在這裡不討論怎麼轉的,提供怎麼實作的簡單教學。)


1. 首先,開一個swift專案 (或者沿用舊的專案也無妨)
image

2. 把你要使用的Objective-C檔案的.h 和.m檔拉到專案中,除了會問你要不要複製到專案中外,還會多跳一個視窗。
簡單來說問你要不要建一個bridge header,選YES
_W__芸_ 2014-07-01 15.38.56

3. 然後可以注意到在 supporting files裡面多了一個檔案
螢幕截圖 2014-07-01 16.14.49

4. 修改bridging-Header.h檔案內容,import 要用的.h檔
螢幕截圖 2014-07-01 16.17.17

5. 然後就可以在swift裡面使用這個class了
螢幕截圖 2014-07-01 16.19.25

缺點:
針對DataSource/Delegate的部分,@protocol的func的自動補完好像有點怪怪的,有的時候可以靠按ESC跳出來,有的時候則否。
原因還在研究中。

不過一些功能的,就算是objective-c的一樣可以使用,可以節省不少開發時間。