Swift知识点收集

2020-03-18  本文已影响0人  红色海_

摘取自网络,自己有整理,被自己不断学习。

1. swift中如何阻止一个方法属性,属性,下标被子类改写?

在类的定义中使用final关键字声明类、属性、方法和下标。final声明的类不能被继承,final声明的属性、方法和下标不能被重写。

2. swift中,实现一个将整形数组全部转化成对应的字符串数组(eg: [1,2,3,4,5] -> ["1","2","3","4","5"])

var sampleArray: [Int] = [1,2,3,4,5]
sampleArray.map {
String($0)
}
//["1", "2", "3", "4", "5"]

3. swift中,关键字 guard 和 defer 的用法

guard也是基于一个表达式的布尔值去判断一段代码是否该被执行。与if语句不同的是,guard只有在条件不满足的时候才会执行这段代码。

guard let name = self.text else { return }
defer的用法是,这条语句并不会马上执行,而是被推入栈中,直到函数结束时才再次被调用。

defer {
//函数结束才调用
}

defer的几种实用场景

4. 使用 swift 中的泛型来编写一段交换两个值的函数
func swapValue<T,U>(inout x: T, inout y: U) -> (x: U, y: T) {
    return (y, x)
}

var tuple = ("ab", 1)
swapValue(&tuple.0, y: &tuple.1)
//(1, "ab")
---Swift 3更新:
func swapValue<T,U>(x: T, y:  U) -> (x: U, y: T) {
    return (y, x)
}
5. 在 swift 中对一个 optional 变量拆包有多少种办法?

如果确定一个 optional 包含值,可以用 ! 来访问,就是强制拆包.
尝试使用!来访问不存在值的optional value 会触发运行时错误。当!来强制拆包(force-unwrap)的时候,
一定要确保这个optional value一定包含一个非nil 值。

隐式拆包: 通过在声明时的数据类型后面加(!)来实现

var str: String! = "Hello World!"
//Hello World!

6. swift中怎么调OC代码

在swift项目中创建一个OC文件的时候,Xcode 会提示创建一个桥接文件 点确定创建桥接文件,Xcode会自动创建一个桥接文件
工程名-Bridging-Header.h
把swift需要用到的OC文件的头文件放到桥接文件里 工程名-Bridging-Header.h

7. open关键字和public关键字区别

鉴于当前写时候是 Swift3.x, 现在共有5种权限控制关键字,之后 Swift4 又会有变化.

open
open 修饰的 class 在 Module 内部和外部都可以被访问和继承
open 修饰的 func 在 Module 内部和外部都可以被访问和重载(override)
Public
public 修饰的 class 在 Module 内部可以访问和继承,在外部只能访问
public 修饰的 func 在 Module 内部可以被访问和重载(override), 在外部只能访问

8. swift中什么时候用结构体,什么时候用类?

Swift中类与结构体的区别

1、到底是用类的做法优于用结构体,还是用结构体的做法优于类。
函数式编程倾向于值类型
面向对象编程更喜欢类。

2、类和结构体有许多不同的特性

-类支持继承、结构体不支持
-类是引用类型、结构体是值类型

3、在运行时,结构体的在性能方面更优于类,原因是结构体的方法调用是静态绑定,
而类的方法调用是动态实现的。这就是尽可能得使用结构体代替类的又一个好的原因。

4、并没有通用的规则决定结构体和类哪一个更好用。一般的建议是使用最小的工具来完成你的目标,但是有一个好的经验是多使用结构体,除非你用了继承和引用语义。

9. 什么是泛型?泛型用来解决什么问题

1、泛型是用来使类型和算法安全的工作的一种类型。
--提高类型安全
在swift中,函数和数据结构中都可以使用泛型,例如类、结构体和枚举

2、泛型一般是用来解决代码复用的问题。

常见的一种情况是,有一个函数,它带有一个参数,参数类型是A,然而当参数类型改变成B的时候,你不得不复制这个函数。

例如下面的代码中第二个函数就是复制第一个函数
它仅仅是用String类型代替了Integer类型。

func areIntEqual(x: Int, _ y: Int) -> Bool {
  return x == y
}

func areStringsEqual(x: String, _ y: String) -> Bool {
  return x == y
}

areStringsEqual("ray", "ray") // true
areIntEqual(1, 1) // true

//Objective-C开发人员可能想到用NSObject类来解决这个问题,代码如下:
import Foundation

func areTheyEqual(x: NSObject, _ y: NSObject) -> Bool {
  return x == y
}

areTheyEqual("ray", "ray") // true
areTheyEqual(1, 1) // true
//这个代码会按照预期的方式工作,
//但是它在编译时不安全。
//它允许字符串和整数相比较,像这样:

areTheyEqual(1, "ray")
//应用程序不会崩溃,
//但是允许字符串和整数相比较不是预想的结果。

//通过采用泛型,
//可合并这两个函数
//并同时保持类型安全。

//下面是代码实现:
func areTheyEqual(x: T, _ y: T) -> Bool {
  return x == y
}

areTheyEqual("ray", "ray")
areTheyEqual(1, 1)
//上面的例子是测试两个参数是否相等,
//这两个参数的类型受到约束都必须遵循Equatable协议。
//上面的代码达到预想的结果, 并且防止了传递不同类型的参数。(类型安全) 
10. 对optional变量拆包有多少种方法?并在安全方面进行评价。

optional变量拆包方法 详细

1、强制拆包 !操作符——不安全
2、隐式拆包变量声明——大多数情况下不安全

3、可选绑定——安全
4、自判断链接(optional chaining)——安全

5、nil coalescing 运算符(空值合并运算符)——安全
6、Swift 2.0 的新特性 guard 语句——安全

7、Swift 2.0 的新特性optional pattern(可选模式)

11. 下面的代码输出是什么?并说明理由。

var thing = "cars"
let clousure = {[thing] in print("I love (thing)")}

thing = "airplanes"
closure()

答案:输出的是:I love cars。
当闭包被声明的时候,捉捕列表就复制一份thing变量,所以被捕捉的值并没有改变,即使你给thing赋予了一个新值。

12. 思考下面的代码:

var optional1:String? = nil
var optional2:String? = .None

nil和.None有什么不同?
optional1和optional2有什么不同?

答案:两者没有什么不同。

Optional.None(简称.None)是optional变量值初始化的标准方法,而nil只是.None语法的一种修饰。事实上下面语句输出是正确的:
  nil == .None//On Swift1.x this doesnt compile.You need Optional.None记住枚举类型的Optional下的None:

enum Optional{
case None
case Some(T)
}

12. 闭包是引用类型吗?

闭包是引用类型。如果一个闭包被分配给一个变量,这个变量复制给另一个变量,那么他们引用的是同一个闭包,他们的捕捉列表也会被复制。

上一篇下一篇

猜你喜欢

热点阅读