1.跨語(yǔ)言(object-c,C++,C)全局變量和函數(shù)
在object-c層面聲明為extern的; 然后在對(duì)應(yīng)的頭文件中定義實(shí)際內(nèi)容。例子:
//ConstVarible.h中的內(nèi)容
#pragma mark - 默認(rèn)的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";
然后在對(duì)應(yīng)的跨語(yǔ)言頭文件中import該頭文件,項(xiàng)目的pch文件中import頭文件,即兩種語(yǔ)言使用同一個(gè)實(shí)體全局變量。
2.類(lèi)和函數(shù)的靜態(tài)變量:
由于沒(méi)有提供class中直接static變量的辦法,所以轉(zhuǎn)用內(nèi)部定義一個(gè)結(jié)構(gòu)體,然后結(jié)構(gòu)體中定義static變量,我的習(xí)慣是:
struct STATIC{
static var headerHeight:CGFloat = 0
}
if STATIC.headerHeight == 0{
STATIC.headerHeight = self.tableView(timeTable, heightForHeaderInSection: indexPath.section)
}
3.MVVM或者M(jìn)VC中的變量使用:
你可能想過(guò)這種辦法:
extension UIView{
var originX:CGFloat{
get{ return self.frame.origin.x }
set{
var tmpFrame = self.frame
tmpFrame.origin.x = newValue
self.frame = tmpFrame
}
}
但是我保證你還沒(méi)有想到這個(gè)辦法:
class HotThemesVC: BaseLoadingEmptyVC {
var data:Array<MotifsEntity>!{
get{
return tableDD.data
}
set{
tableDD.data = newValue
}
}
}
這樣做,在當(dāng)前類(lèi)中使用的data就變成了對(duì)應(yīng)的tableDD中得data,不再受語(yǔ)法干擾,類(lèi)似python中得import ...效果。
4.typealias 可傳遞類(lèi)型定義:
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技術(shù)上學(xué)來(lái)的
5.tuple的使用,swift新增了元組類(lèi)型,python的招式。可以直接傳遞元組作為參數(shù),這在傳遞多個(gè)對(duì)象但是由不愿意從新去定義一個(gè)結(jié)構(gòu)體(含有這些參數(shù)作為成員)時(shí),非常有用。。當(dāng)然了,也可以直接返回元組,甚至是函數(shù)或者閉包的元組。例如我在計(jì)算日期的時(shí)候,就經(jīng)常這樣:
let (year, month, day) = caculate("20140130")
6.Optional的使用,一個(gè)變量聲明為:
var x:Int? = nil
其本質(zhì)為 Optional<Int> *x, Optional是一個(gè)模板,要么返回對(duì)象本身(使用?或者!進(jìn)行解包的時(shí)候),要么返回none告知if語(yǔ)句這個(gè)東西是空的。
所以使用習(xí)慣是:
if let a = x {
//x指向?qū)嶋H內(nèi)容,而不是空指針。這在很多時(shí)候用得著,比如一個(gè)UIView要使用導(dǎo)航控制器,但是有時(shí)候也有可能是nil的時(shí)候。
}
7.延遲初始化:在首次使用的時(shí)候才初始化,如果變量依賴(lài)于對(duì)象的某些特性,這個(gè)很有用,我經(jīng)常這樣創(chuàng)建一些view,這樣節(jié)省性能。
class A:NSObject{
lazy var topView: ThemesTopView! = { return ThemesTopView.instance() }()
}
8.判斷對(duì)象的類(lèi)型:不再使用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)
}