Swift5 类型转换、泛型、扩展与协议
1. Swift 判断值类型
var anyObj: Any = 1
if anyObj is Int {
print("anyObj's type is Int")
} else if anyObj is String {
print("anyObj's type is String")
}
2. Swift 判断引用类型
class Base {
var text = "base text"
}
class Sub1: Base {
var subText1 = "sub1 text"
}
class Sub2: Base {
var subText2 = "sub2 text"
func subFunc() {
print("sub func invoke")
}
}
3. Swift 类型转换
var obj = Base()
var subObj1 = Sub1()
var subObj2 = Sub2()
var arrayObj: [Base] = [obj, subObj1, subObj2]
for index in 0..<arrayObj.count {
let obj = arrayObj[index]
if obj is Sub1 {
let subObj = obj as! Sub1
print(subObj.subText1)
} else if obj is Sub2 {
let subObj = obj as! Sub2
print(subObj.subText2)
} else {
print(obj.text)
}
}
4. Swift AnyObject 与 Any
var arrayAnyObj: [AnyObject] = [obj, subObj1, subObj2]
var arrayAny: [Any] = [1, "2", true, obj, (0, 0), {(param: Int) -> Int in return param}]
5. Swift 泛型与扩展
func printSelf<T>(_ param: T) {
print(param)
}
printSelf("text")
printSelf(1000)
struct List<T> {
private var datas: [T] = []
mutating func add(_ newEle: T) {
datas.append(newEle)
}
mutating func get(_ index: Int) -> T {
return datas[index]
}
}
extension List {
func getDatas() -> [T] {
return datas
}
}
var list = List<Int>()
list.add(1)
list.add(2)
list.add(3)
var ele = list.get(1)
print(ele)
var datas = list.getDatas()
print(datas)
6. Swift 泛型约束
struct ObjList<T: Base> {
private var datas: [T] = []
mutating func add(_ newEle: T) {
datas.append(newEle)
}
mutating func get(_ index: Int) -> T {
return datas[index]
}
}
var objList = ObjList<Sub1>()
objList.add(subObj1)
class MultipleType<T, R> where T: BaseProtocol, R: SubProtocol {
}
7. Swift 协议 protocol
protocol BaseProtocol {
associatedtype T
func printType(input: T) -> Void
var field1: T {get}
var field2: String {get set}
static func method()
}
protocol SubProtocol: BaseProtocol {
}
protocol ClaProtocol: AnyObject {
}
8. Swift 遵守实现协议
class ClassImpl: BaseProtocol {
func printType(input: String) {
print(input)
}
var field1: String {
get {return "field1"}
set {}
}
var field2: String {
get {return "field2"}
set {}
}
static func method() {}
}
extension ClassImpl {
var extField: Int {
get {
return 100
}
}
func extFunc() {
print("ext func")
}
}
var implCla = ClassImpl()
implCla.printType(input: "input text")
print(implCla.extField)
implCla.extFunc()
9. Swift 定义协议可选实现
@objc protocol OptionalProtocol: AnyObject {
@objc optional func method();
}
extension OptionalProtocol {
func method() {
print("default method extension")
}
}
class ClassOptPro: OptionalProtocol {
}
var claOptIns = ClassOptPro()
claOptIns.method()