1.跨语言(object-c,C++,C)全局变量和函数
在object-c层面声明为extern的; 然后在对应的头文件中定义实际内容。例子:
//ConstVarible.h中的内容
#pragma mark - 默认的app更新下载地址
extern const int itunesId;
extern const NSString *kNornalAppAddress;
extern const NSString *kBaseURL;
//函数也是一样的,
//ConstVarible.m或者.c .cpp中的内容
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.类和函数的静态变量:
由于没有提供class中直接static变量的办法,所以转用内部定义一个结构体,然后结构体中定义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的招式。可以直接传递元组作为参数,这在传递多个对象但是由不愿意从新去定义一个结构体(含有这些参数作为成员)时,非常有用。。当然了,也可以直接返回元组,甚至是函数或者闭包的元组。例如我在计算日期的时候,就经常这样:
let (year, month, day) = caculate("20140130")
6.Optional的使用,一个变量声明为:
var x:Int? = nil
其本质为 Optional<Int> *x, Optional是一个模板,要么返回对象本身(使用?或者!进行解包的时候),要么返回none告知if语句这个东西是空的。
所以使用习惯是:
if let a = x {
//x指向实际内容,而不是空指针。这在很多时候用得着,比如一个UIView要使用导航控制器,但是有时候也有可能是nil的时候。
}
7.延迟初始化:在首次使用的时候才初始化,如果变量依赖于对象的某些特性,这个很有用,我经常这样创建一些view,这样节省性能。
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)
}