Swift知识点总结
mutating的作⽤
struct 是值类型,默认情况下实例⽅法不能修改值类型的属性 需加 mutating
1.1 Swift 不建议在struct,enum的普通⽅法⾥修改属性值,但是加了mutating 关键字之后就可以了 如下
struct Point {
var x = 0
var y = 0
mutating func movePoint(x:Int,y:Int) {
self.x = 1
}
}
1 class 和 struct 的区别
class 是类,引⽤类型,可以继承
Struct 是结构体,值类型,不可继承
2 不通过继承,代码复⽤,共享的⽅式
扩展,全局函数,继承应该也可以
3 Set独有的⽅法:
求 交集,并集,合集,对称差集(各⾃有的),元素没有顺序,同样的元素只能有⼀个。
4 实现⼀个min 函数,返回两个元素较⼩的元素
func min<T:Comparable>(a : T,a : T) -> T {
return a > b ? a : b
}
5 map filter reduce 的区别
map: 对数组中的每个元素进⾏处理,返回同长数组。(映射)
filter: 返回符合条件的元素组成的数组。(过滤)
reduce: 数字的话返回和。(合并)
6 map 和 filtmap的区别
map 返回可选值
filtmap 返回解析后的,去掉返回值为空的元素。
7 什么是copy on write
写时复制,即 swift 中发⽣赋值⾏为时, 不会重新开辟内存,只有在被赋值元素发⽣改变时才复制。
学swift语言能干什么8如何获取当前代码的函数和⾏号
print("函数名:\(#function)")
print("⾏号:\(#line)")
9如何声明⼀个只能被类conform 的protocol(x)
声明协议的时候加⼀个class
protocol SomeClassProtocl: class {
func someFunction()
}
10 guard 使⽤场景
guard password == confirmPassword else {
print("两次输⼊密码不⼀致")
return
}
11 defer 使⽤场景
清理⼯作,回收资源,如关闭⽂件
12 String 和 NSString 的关系与区别?
String: 结构体 值类型
NSString : 类,引⽤类型
13 怎么获取⼀个字符串的长度
.count
.lengthOfBytes(using:ascii)
14 如何截取字符串的某段字符串。
对String 做了个扩展 ,计算index 很反⼈类,扩展成类似之前的substring
15 throw 和rethrows的⽤法与作⽤
throws ⽤在函数上,表⽰这个函数会抛出错误,
rethrows只适⽤于参数中有函数,且会抛异常的情况。
16 try? 和 try!
函数抛出异常时使⽤
⽤ try? 抛出异常不会崩溃, 会返回 nil
⽤ try! 会崩溃
17 associatedtype的作⽤?
简单讲就是protocol 使⽤的泛型,如下:
protocol ListProtcol {
associatedtype Element
//或者指定
typealias Element = Int
func push(_ element:Element)
func pop(_ element:Element) -> Element?
}
18 什么时候使⽤final
不希望继承的⼦类重写⽅法时。限制继承后的重写
19 public 和 open
Open 嘛 ⽐public 范围更⼤⼀些, 模块外也可以继承。
20 声明⼀个没有返回值的闭包
typealias SomeCloseTypes4 = (Int,Int) -> (Int)
let someCloseTypes4 : SomeCloseTypes4 = {(a:Int,b:Int) in
return a + b
}
21 Self 的使⽤场景
通常在⼀个协议中使⽤,⽤来表⽰实现者或者实现者的⼦类类型。
如定义个复制的协议
protocol CopyProtocal {
func copy() -> Self
}
如果是结构体实现,需要将Self 换成具体的类型。
struct SomeStruct: CopyProtocol {
let value: Int
func copySelf() -> SomeStruct {
return SomeStruct(value: self.value)
}
}
23 dynamic
Swift 是⼀个静态语⾔,所以没有oc的消息发送这些机制,dynamic 的作⽤就是让Swift 有oc的动态机制,常⽤的地⽅如KVO。如需要监控⼀个属性,则必须标记为dynamic。 try
24 什么时候使⽤@objc
需要调⽤oc⽅法的时候,如btn的selector,的⽅法需要
因为selector 是oc runtime的⽅法, 默认是不可见的,需要@objc 修饰暴露出来。
25 可选型是⽤什么实现的?
enum Optional<Wrapped> {
case none
case some(Wrapped)
}
26 ⾃定义下标获取
public subscript(index: Int) -> Element
27 ?? 的作⽤
var name = ”11“
print(name ? "名字为空") 当字符串为空的时候,输出 ?? 后⾯的
28 lazy 作⽤
懒加载 需要的时候再去调⽤, 节省某段时间。
30 inout 作⽤ 传递指针 输⼊输出参数
31 Error 兼容NSError 直接转换 as 会丢失数据
32下⾯的代码⽤了哪些语法糖? [1 ,2 ,3].map{$0 * 2}
1 快速创建数组
2 第⼀个参数⽤ $0 代替
3 闭包类型的⾃动推断 闭包没有声明函数参数,返回值类型等。
4 闭包中语句只有⼀句,⾃动将这⼀句的结果作为返回值。
33 什么是⾼阶函数?
⼀个函数,如果可以以函数作为参数或者返回值
34 如何解决循环引⽤
使⽤弱引⽤
转化成值类型
35 代码是否会崩溃?
var mutableArray = [1,2,3]
for _ in mutableArray {
}
不会
for in 循环内部是⼀个Iterator的实现,array.makeIterator()返回了⼀个迭代器。所有for in 迭代的是⼀个迭代器,和原数组没有关系了,所以不会崩溃
36 给集合中元素是字符串的类型添加⼀个扩展⽅法,应该怎么声明?
extension Array where Element == String {
var isStringElement:Bool {
retrun true
}
}
37 定义静态⽅法时,关键字static 和 class有什么区别?
static 定义的⽅法不可以被⼦类继承,class 则可以
38 ⼀个Sequence 的索引是不是⼀定从0 开始
不⼀定,不保证都从0 开始。
39 数组实现了那些协议?
mutableCollection 实现了可修改的数组
expressibleByArrayLiteral 实现了字⾯值初始化的能⼒
41 autoclosure 的作⽤
⾃动将⼀个表达式封装成闭包。
42 编译选项 whole modle optmization优化了什么?
编译器对代码的分析不在局限于⼀个⽂件,⽽是从整个模块。对代码了解的全⾯,编译的更好。
43 dynamic frameword 和 static framework 的区别
静态库和动态库
静态库是每个程序单独打包⼀份
动态库则是多个程序之间共享。
44 willSet didSet 的使⽤, 例如变量的值发⽣改变做出⼀些响应:
struct People {
var name = ""
var age = 0
var sex = ""
}
var jack = People() {
willSet {
print("准备赋值")
print(jack.name)//此时打印还没有值
}
didSet {
print("赋值成功")
print(jack.name)
//调⽤⽅法
myFunction()
}
}
let nick = People(name: "⽹络请求数据", age: 19, sex: "男")
jack = nick
45 lazy: 只对想要的元素进⾏map 和 filter 操作?
let items = (1...4000).lazy.map { $0 * 2 }.filter { return $0 < 10 }
print(items.first) // Optional(2)
for temp in items {
print(temp)
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论