一、使用 可选链式 调用代替强制展开
//当声明一个属性时,将属性类型设置为可选类型: 好处: 当可选类型的属性被赋予初始值时,系统调用初始值;当可选类型属性没有赋予初始值时,系统只会调用失败;如果属性强制展开,就会崩溃
// 如果属性为一般类型,则必须赋予初始值
struct Point {
var width : Int = 0
}
class Person {
var name : String = ""
var age : Int? //可选类型, 可以不赋值
var po : Point? = Point.init() //赋值
}
//调用
var person = Person.init()
person.name = "adsf"
print(person.name)
print(person.age)
//print(person.po!.width) //展开,只有赋有初始值,展开才不会报错
person.po?.width = 1000
二、类型匹配
1.检查类型 is
var array = [1,2,"10","88",90,100]
var strNum = 0
var intNum = 0
for i in array {
if i is Int{
intNum += 1
}
if i is String {
strNum += 1
}
}
print(strNum,intNum) // 2 4
2.向下转型 as? 或 as!
//NSMutableArray > NSArray > Array
//可变类型-->不可变-->swift
var arr = NSMutableArray.init(capacity: 0)
arr.addObject(1)
arr.addObject(2)
let arr2 = arr as NSArray
let arr3 = arr2 as Array //最终arr3 变成swift中的数组类型
print(arr3)
3.Any 和 AnyObject :
//a.AnyObject 可以表示任何类类型的 实例。
//b.Any 可以表示任何类型,包括函数类型。
var array6 : [AnyObject] = [1,2,3,4,"io"]
print(array6)
三、扩展
//1.扩展语法
extension Int {
//2.属性扩展 (一定有返回值的)
var a : Int {
return self * 10
}
//3.方法扩展
func age() -> Void{
print("age")
}
}
//使用拓展
var ss : Int = 5
print(ss)
print(ss.a)
ss.age()
4.如果给父类扩展,则子类同样可以获取到
例:
class Student{
var name = ""
}
class Xiao: Student {
var age = 2
}
//扩展父类
extension Student {
func eat() -> Void{
print("eat")
}
}
//调用
var stu = Student.init()
stu.eat()
var xiao = Xiao.init()
xiao.eat() //子类可以调用父类的 拓展的方法