CustomStringConvertible
遵守CustomStringConvertible CustomDebugStringConvertible都可以实现自定义打印字符串
class Person: CustomStringConvertible,CustomDebugStringConvertible {
var age = 0
var description: String {
return "person_\(age)"
}
var debugDescription: String {
return "debug_person_\(age)"
}
}
var person = Person()
print(person)
debugPrint(person)
print调用的是CustomStringConvertible协议的description
debugPrint调用的是CustomDebugStringConvertible协议的debugDescription方法
Self
代表当前类型
class Person {
var age = 1
static var count = 2
func run() {
print(self.age)
print(Self.count)
}
}
self 代表谁调用这个方法 他就是谁
Self 代表Person这个类型 调用类型属性 类型方法
一般用作返回值类型 限定返回值跟方法调用者必须是同一类型(也可作为参数类型)
protocol Runnable {
func test() -> Self
}
class Person: Runnable {
required init() {
}
func test() -> Self {
return type(of: self).init()
}
}
class Student: Person {
}
var p = Person()
print(p.test())
var stu = Student()
print(stu.test())
swiftTest.Person
swiftTest.Student
断言
不符合指定条件就抛出运行时错误 常用于调试阶段(Debug)阶段的判断
默认情况下,断言只会在debug模式下生效 release模式下没有效果
无法通过do-catch捕捉错误
func divide(_ v1: Int, _ v2: Int) -> Int {
assert(v2 != 0, "除数不能为0")
return v1 / v2
}
print(divide(20, 0))
错误信息.png
如果需要在release模式下开启断言 可以在Swift Flags的Release里面设置assert-config Debug
如果需要在debug模式下强制关闭断言 就再Debug里面设置assert-config Release
fatalError
如果遇到严重问题 希望结束程序运行时 可以直接使用fatalError函数抛出错误(这是无法通过do-catch捕捉的错误)
func test(_ num: Int) -> Int {
if num >= 0 {
return 1
}
fatalError("num 不能小于0")
}
test(-1)
fatalError错误.png
在某些不得不实现 但不希望别人调用的方法 可以考虑内部使用fatalError函数
class Person {
required init() {
}
}
class Student: Person {
required init() {
fatalError("don't call Student.init")
}
init(score: Int) {
}
}
var stu1 = Student(score: 98)
var stu2 = Student()
内部使用fatalError.png
fatalError assert区别
1. fatalError 不需要写return assert还是需要的
2. fatalError 不管在debug 还是release都可以使用
assert在release无法使用 只能在debug使用 (除非强制设置在release开启断言)
do-catch 可以对错误进行捕捉进行一些补救 友善的提示
fatalError assert抛出无法挽救的错误 直接结束程序的时候使用
网友评论