1.跨語言(object-c,C++,C)全局變量和函數(shù)
在object-c層面聲明為extern的; 然后在對應的頭文件中定義實際內(nèi)容。例子:
//ConstVarible.h中的內(nèi)容
#pragma mark - 默認的app更新下載地址
extern const int itunesId;
extern const NSString *kNornalAppAddress;
extern const NSString *kBaseURL;
//函數(shù)也是一樣的,
//ConstVarible.m或者.c .cpp中的內(nèi)容
const int itunesId = 923818540;
const NSString *kNornalAppAddress = @"https://itunes.apple.com/us/app/xian-ren-zhang-gu-piao/id923818540?l=zh&ls=1&mt=8";
然后在對應的跨語言頭文件中import該頭文件,項目的pch文件中import頭文件,即兩種語言使用同一個實體全局變量。
2.類和函數(shù)的靜態(tài)變量:
由于沒有提供class中直接static變量的辦法,所以轉(zhuǎn)用內(nèi)部定義一個結構體,然后結構體中定義static變量,我的習慣是:
struct STATIC{
static var headerHeight:CGFloat = 0
}
if STATIC.headerHeight == 0{
STATIC.headerHeight = self.tableView(timeTable, heightForHeaderInSection: indexPath.section)
}
3.MVVM或者MVC中的變量使用:
你可能想過這種辦法:
extension UIView{
var originX:CGFloat{
get{ return self.frame.origin.x }
set{
var tmpFrame = self.frame
tmpFrame.origin.x = newValue
self.frame = tmpFrame
}
}
但是我保證你還沒有想到這個辦法:
class HotThemesVC: BaseLoadingEmptyVC {
var data:Array<MotifsEntity>!{
get{
return tableDD.data
}
set{
tableDD.data = newValue
}
}
}
這樣做,在當前類中使用的data就變成了對應的tableDD中得data,不再受語法干擾,類似python中得import ...效果。
4.typealias 可傳遞類型定義:
class TopicTableVC:UIViewController{
typealias RowDataType = ThemesTableVC.RowDataType
typealias TableData = ThemesTableVC.TableData
typealias CellType = ThemesTableVC.CellType
}
class ThemesTableVC{
typealias RowDataType = PortfoliosEntity
typealias TableData = Array<RowDataType>
typealias CellType = CombinationCell
}
這一招我是從C++的STL中得traits技術上學來的
5.tuple的使用,swift新增了元組類型,python的招式。可以直接傳遞元組作為參數(shù),這在傳遞多個對象但是由不愿意從新去定義一個結構體(含有這些參數(shù)作為成員)時,非常有用。。當然了,也可以直接返回元組,甚至是函數(shù)或者閉包的元組。例如我在計算日期的時候,就經(jīng)常這樣:
let (year, month, day) = caculate("20140130")
6.Optional的使用,一個變量聲明為:
var x:Int? = nil
其本質(zhì)為 Optional<Int> *x, Optional是一個模板,要么返回對象本身(使用?或者!進行解包的時候),要么返回none告知if語句這個東西是空的。
所以使用習慣是:
if let a = x {
//x指向?qū)嶋H內(nèi)容,而不是空指針。這在很多時候用得著,比如一個UIView要使用導航控制器,但是有時候也有可能是nil的時候。
}
7.延遲初始化:在首次使用的時候才初始化,如果變量依賴于對象的某些特性,這個很有用,我經(jīng)常這樣創(chuàng)建一些view,這樣節(jié)省性能。
class A:NSObject{
lazy var topView: ThemesTopView! = { return ThemesTopView.instance() }()
}
8.判斷對象的類型:不再使用isKindOfClass。
func pushToDetail<T>(result:T){
isPopedFromNav = true
var vc:UIViewController! = nil
if result is SStockDataEntity{
let model = result as SStockDataEntity
let stockModel = XRZStockModel()
(stockModel.name, stockModel.code) = (model.name, model.code)
vc = XRZStockMarketViewController(stockMarkStyle: StockMarketStyle.OneStockMarketStyle, withStocks: [stockModel], withPage: 0);
}else if result is SPortfoliosDataEntity {
let model = result as SPortfoliosDataEntity
MobClick.event("search_result")
vc = XRZGroupDetailsViewController();
(vc as XRZGroupDetailsViewController).groupId = "\(model.id)"
(vc as XRZGroupDetailsViewController).setTitle(model.name, andColorIndex:0)
}else{
let model = result as SUserDataEntity
vc = XRZFinancialViewController(nibName: "XRZFinancialViewController", bundle: nil)
}
self.vm?.navigationController?.pushViewController(vc, animated: true)
}