Swift和OC的区别?
1.swift是静态语言,有类型推断,OC是动态语言。
2.swift面向协议编程,OC面向对象编程
3.swift注重值类型,OC注重引用类型。
4.swift支持泛型,OC只支持轻量泛型
5.swift支持静态派发(效率高)、动态派发(函数表派发、消息派发)方式,OC支持动态派发(消息派发)方式。
6.swift支持函数式编程
7.swift的协议不仅可以被类实现,也可以被struct和enum实现
8.swift有元组类型、支持运算符重载
9.swift支持命名空间
10.swift支持默认参数
11.swift比oc代码更加简洁
Struct和Class区别?
1.Struct不支持继承、Class支持继承
2.Struct是值类型,Class是引用类型
3.Struct无法修改自身属性值,函数需要添加mutating关键字
4.Struct初始化方法是基于属性的
5.Struct不需要deinit方法,因为值类型不关心引用计数,Class需要deinit方法。
inout 的作用
inout 输入输出参数,让输入参数可变类似__block 的作用。
1 函数参数默认为常量。试图从函数主体内部更改函数参数的值会导致编译时错误。这意味着您不能错误地更改参数的值。如果您希望函数修改参数的值,并且希望这些更改在函数调用结束后仍然存在,请将该参数定义为输入输出参数。
2 您可以通过将inout关键字放在参数类型的前面来编写输入/输出参数。一个在出参数具有传递的值中,由函数修改的功能,并将该部分送回出的功能来代替原来的值。
3 您只能将变量作为输入输出参数的参数传递。您不能将常量或文字值作为参数传递,因为无法修改常量和文字。当您将一个与号(&)作为变量传入in-out参数时,将它放在变量名的前面,以表明该变量可以被函数修改。
4 注意:输入输出参数不能具有默认值,并且可变参数不能标记为inout。
map、filter、reduce 的作用
map 用于映射, 可以将一个列表转换为另一个列表
[1, 2, 3].map{"\($0)"}// 数字数组转换为字符串数组
["1", "2", "3"]
filter 用于过滤, 可以筛选出想要的元素
[1, 2, 3].filter{$0 % 2 == 0} // 筛选偶数
// [2]
reduce 合并
[1, 2, 3].reduce(""){$0 + "\($1)"}// 转换为字符串并拼接
// "123"
为什么数组索引越界会崩溃,而字典用下标取值时 key 没有对应值的话返回的是 nil 不会崩溃。
struct Array<Element> {
subscript(index: Int) -> Element
}
struct Dictionary<Key: Hashable, Value> {
subscript(key: Key) -> Value?
}
1 数组索引访问的是一段连续地址,越界访问也能访问到内存,但这段内存不一定可用,所以会引起Crash.
2 字典的key并没有对应确定的内存地址,所以是安全的.
给集合中元素是字符串的类型增加一个扩展方法,应该怎么声明?
使用 where 子句, 限制 Element 为 String
extension Array where Element == String {
var isStringElement:Bool {
return true
}
}
["1", "2"].isStringElement
//[1, 2].isStringElement// error