從上周開(kāi)始, 正式使用Swift語(yǔ)言進(jìn)行實(shí)際項(xiàng)目的開(kāi)發(fā), 雖然之前Swift的語(yǔ)法已經(jīng)了解過(guò), 并且寫過(guò)幾個(gè)簡(jiǎn)單的小Demo, 但是在實(shí)際應(yīng)用到了公司項(xiàng)目中還是遇到了一些小問(wèn)題. 主要是Swift與OC語(yǔ)法對(duì)比下的一些用法不同, 還有一些就是混編的問(wèn)題.
- OC項(xiàng)目, 新建Swift文件,沒(méi)有自動(dòng)生成橋接文件
這個(gè)問(wèn)題只基于本人公司項(xiàng)目的實(shí)際情況進(jìn)行說(shuō)明.(OC項(xiàng)目添加Swift文件)
-
打開(kāi)工程文件->BuildSetting 檢查是否已經(jīng)存在了Objective-C Bridging Header
1這個(gè)是要導(dǎo)入了橋接文件才會(huì)生成的, 所以如果之前你的項(xiàng)目中創(chuàng)建過(guò)Swift文件, 也就是生成過(guò)了橋接文件, 即時(shí)你之后把橋接文件刪掉了, 再次導(dǎo)入Swift文件, 它是不會(huì)給你重新自動(dòng)生成橋接文件的.
解決:
把Objective-C Bridging Header 后面對(duì)應(yīng)的路徑刪除, 然后在重新創(chuàng)建Swift文件, 這時(shí)就會(huì)提示創(chuàng)建橋接文件了.
自己手動(dòng)創(chuàng)建一個(gè)橋接文件, 然后手動(dòng)更改Objective-C Bridging Header后面的為路徑為你手動(dòng)創(chuàng)建的橋接文件的路徑.
- Swift調(diào)用OC的Category
先說(shuō)一下在混編時(shí)OC類和Swift類的互相調(diào)用:
Swift調(diào)用OC --- 在創(chuàng)建的橋接文件中導(dǎo)入OC類的.h文件 #import "xxx.h"
OC調(diào)用Swift --- 要被OC調(diào)用的Swift類要做一個(gè)聲明,用到@objc
下面是新建的一個(gè)Swift類 , 如果要使得此類能被OC累調(diào)用, 需要添加@objc(TestClass)(括號(hào)內(nèi)為類名)
import UIKit
@objc(TestClass)
class TestClass: NSObject {
}
**下面說(shuō)回重點(diǎn) **
這個(gè)問(wèn)題我用實(shí)際代碼來(lái)說(shuō)可能會(huì)清楚一些.下面是我的一個(gè)OC的Category
// NSDictionary+Handle.h
// Created by sunxb on 16/12/2.
// Copyright ? 2016年 sunxb. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface NSDictionary (Handle)
- (void)handleData;
@end
這是一個(gè)NSDictionary的Category, 按照之前的Swift調(diào)用OC類的規(guī)則, 我們應(yīng)該在橋接文件中#import "NSDictionary+Handle.h", 然后編譯一下, 然后在Swift中實(shí)例一個(gè)字典,然后調(diào)用.
注意: Swift的類型安全問(wèn)題, 我們?cè)赟wift中創(chuàng)建的是Dictionary, 雖然系統(tǒng)在底層做了Dictionary與NSDictionary的橋接, 我們?cè)趯?shí)際使用時(shí)仍要做手動(dòng)的類型轉(zhuǎn)換, 就像這樣let dict = ["key":"value"] as! NSDictionary , 如果不強(qiáng)制轉(zhuǎn)為NSDictionary是無(wú)法調(diào)用OC Category中的方法的. 或者新建一個(gè)OC的類, 把Category中的方法在封裝一次, Dictionary實(shí)例的對(duì)象當(dāng)做參數(shù)傳進(jìn)去.
#import "DealDictionary.h"
#import "NSDictionary+Handle.h"
@implementation DealDictionary
+ (void)dealDictionary:(NSDictionary *)dict {
[dict handleData];
}
@end
直接調(diào)用這個(gè)類的類方法, 把需要處理的字典直接傳進(jìn)來(lái)就ok, 字典也無(wú)需做強(qiáng)轉(zhuǎn), 不過(guò)有點(diǎn)麻煩, 建議一些簡(jiǎn)單的Category就直接用Swift重新寫成這個(gè)類的extention, 類型轉(zhuǎn)化頁(yè)ok, 隨心情.
- pod ‘SwiftyJSON’ 遇到的問(wèn)題
需要在Podfile文件中添加use_frameworks! ,導(dǎo)入成功后編譯項(xiàng)目會(huì)報(bào)錯(cuò)--.h文件找不到 . (影響了之前導(dǎo)入的三方庫(kù)的使用)
**原因: cocoapods 里面不使用 use_frameworks!, 則是通過(guò)static libraries 這個(gè)方式來(lái)管理pod的代碼. 而如果使用了use_frameworks!, 則cocoapods 使用frameworks 來(lái)取代static libraries 方式. **
解決方法:
- 全工程里面更改某些庫(kù)的導(dǎo)入方式, 具體分析是 #import "" #import <>這兩種導(dǎo)入方式的哪一種
- 不用cocoapods, 直接把項(xiàng)目拖進(jìn)工程里面.
- 一些Swift與OC不同的使用方法
OC: isKindOfClass --- Swift : 直接用 is
OC: boolValue等 --- Swift: 先把String轉(zhuǎn)為NSString類型, 在.booValue
持續(xù)更新中
