您的位置:首页 > 其它

PART 4

2017-05-08 19:57 211 查看

当UINavigationController与UITabBarController同时存在时,如何让两者的标题互不影响

开门见山,代码如下:

self.tabBarController.navigationItem.title = @"XXX";
self.tabBarItem.title = @"XXX";


柯里化

import Foundation

//MARK: - curring

//所谓“柯里化”,就是将多参数的函数转化成单参数的函数,是函数式编程的两个最基本的运算之一,另一个是合成。而柯里化是为合成服务的,因为多参数函数的合成非常麻烦。

/// 柯里化测试
///
/// - Parameter y: 一个整型数
/// - Returns: 一个接受一个整型数并返回一个整型数的闭包
func inputYAndX(y: Int) -> ((Int) -> Int) { //返回值最外层的括号可以去掉,这里用括号来表示返回值是一个完整的部分
return {
return $0 + y
}
}

print(inputYAndX(y: 12)(12)) //24


随闭包

尾随闭包是Swift的一大特点,它使得我们的代码看起来更加简洁,但也让不知道这个特性的同胞觉得Swift语法很
很高科技
。其实尾随闭包是指:如果函数的最后一个参数是闭包,函数的参数可以提前结束,最后一个参数可以直接使用
{}
包装闭包的代码。如果函数参数只有一个闭包,则包含函数参数列表的
()
可以省略。

import Foundation

extension intmax_t {
func times(f: intmax_t -> ()) {
print("intmax_t extension")
for i in 1...self {
f(i)
}
}

//before Swift 1.2 the follows code exist closure ambiguity
func times(f: Void -> Void) {
print("intmax_t void extension")
for _ in 1...self {
f()
}
}
}

//standard code
3.times ({
(i: intmax_t) -> () in
print(i)
})

//trailing closures
3.times() {
(i: intmax_t) -> () in
print(i)
}

3.times {
(i: intmax_t) -> () in
print(i)
}

//小知识:Safari切换标签页快捷键: 上一个: cntrl + shift + tab 下一个:cntrl + tab


命名空间

如果有人问我用objc感觉最不爽的是什么,那就是在项目及其内部文件的命名时要加前缀。为什么要加前缀?答:在一定程度上防止源文件同名冲突。

这一切归根结底是objc不支持
命名空间
。命名空间存在的意义就是为了隔离命名的作用域,从根本上解决同名冲突的问题。举一个简单的例子说明:在教室A中,有两个学生都叫B,老师点到时,叫B就会有两个人站起来。如何区分这两个同名的学生,就成了一个问题!objc的解决方法就是学校采用的方法,在名字里加个前缀或者后缀,从此,这两个人在学校里有了新的名字。Swift的方案是把两个B分在不同的班,不让他们在同一间教室上课。命名空间就充当这里教室或者班的作用。

顺带一提,Swift默认的命名空间是整个项目,其中所有的类是共享的,在类A中使用类B不需要导入头文件,并且类的属性默认也是共享的,其他文件可以直接访问。

构造函数

虽然,objc是我们进行iOS开发赖以使用的语言,至少在Swift问世之前是这样的。或许因为爱之深,责之切,我们总会抱怨它这样那样的缺点而又不得不使用它,比如说不支持函数的重载:函数名相同,参数列表不同(个数与类型)。

对于父类所提供的对象构造函数,通常不能满足我们的需求,因为自定义类大多有自己的属性需要初始化。由于上面提到的这个缺憾,我们在写自定义的构造函数时,不得不以initW开头,否则编译器将无法识别它是此类的构造函数,自然而然在函数内部就不能调用父类的构造函数了。这里的W当然是指With,注意大小写!不信你可以不按这个规矩来试试。不出意外,你会遇到这样一个错误:Cannot assign to ‘self’ outside of a method in the init family。嗯,这就是objc变相的重载,要是我敢这样捂着眼睛说的话!

objc中就算你实现了类对应构造函数,从父类继承下来的构造函数依然会保留,比如说NSObjectinit方法。而在Swift中,如果你重载了构造函数,并没有重写父类的构造函数,那么这个从父类继承的没有对该类属性有任何初始化代码的空构造函数将会被舍弃。因为在Swift中要求在调用父类构造函数时必须先初始化当前类的必选属性,而objc中恰恰相反,同时没有强制的约束。只怪它是一门弱类型的语言,这是多么宽松的政策啊,多么痛的领悟啊!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息