第一个:泛型 交换方法 N多文章都copy烂了 增强了一个泛型类型的判断
var a = 0
var b = 1
var aStr = "a"
var bStr = "b"
print(a,b,aStr,bStr)
swapValues(a: &a, b: &b)
swapValues(a: &aStr, b: &bStr)
print(a,b,aStr,bStr)
let date = NSDate() //类型转字符串的方法
print(NSStringFromClass(type(of: date)))
print(NSStringFromClass(object_getClass(date)!))
/// 泛型交换方法
///
/// :param:
/// :returns: void
func swapValues <T> ( a:inout T , b:inout T) {
let temp = a
a = b
b = temp
if T.self == type(of: Int()) {
print("数字交换")
}else {
print("字符串交换")
}
}
/// 查找数字位置
///
/// :param:
/// :returns: void
func findIndex<T: Equatable> (_ array: [T], _ valueToFind: T) -> Int? {
for (index,value) in array.enumerated(){
if value == valueToFind { //如果没指定S:Equatable 这句话会编译不通过
return index
}
}
return 0
}
第二个: 类中如何使用泛型 支持多个泛型
class Stack<Element,Dacai> {
var containers = [Element]()
var containers2 = [Dacai]()
func push(e: Element) {
containers.append(e)
}
func pop() -> Element {
return containers.removeLast()
}
func dcPush(e: Dacai) {
containers2.append(e)
}
func dcPop() -> Dacai {
return containers2.removeLast()
}
}
var data1: Stack<Int,DCTool> = Stack<Int,DCTool>()
var data2: Stack<String,DCTool> = Stack<String,DCTool>()
data1.push(e: 10)
data1.dcPush(e: DCTool())
data2.push(e: "10")
data2.dcPush(e: DCTool())
print(data1.containers,data1.containers2)
print(data2.containers,data2.containers2)
第三个:protocol中 mutating关键词干嘛的
protocol Vehicle {
var numberOfWheels: Int {get}
var color: UIColor {get set}
mutating func changeColor()
}
struct MyCar: Vehicle {
let numberOfWheels = 4
var color = UIColor.blue
mutating func changeColor() {
color = .red
} //mutating 会报这个错误 Cannot assign to property: 'self' is immutable
}
class MyFerrari: Vehicle {
let numberOfWheels = 4
var color = UIColor.red
func changeColor() { //类中实现的协议 没有任何问题
color = .black
}
}
第四个:扩展协议 where 的用法 关联类型
protocol Father {
}
protocol Son : Father{
}
class FatherClass: Father {
}
class SonClass: Son {
}
protocol Container {
associatedtype ItemType
}
extension Container where ItemType: Father {
var b: Int {return 100}
}
extension Container where ItemType: Son {
var b: Int {return 200}
}
class TestClass: Container {
typealias ItemType = SonClass //这里指定泛型的类型
}
let myCass = TestClass()
print (myCass.b)
第五个:实战WHERE的用法 协议 加载xib
protocol NibLoadable {
}
extension NibLoadable where Self : UIView {
static func loadFromNib(_ nibname : String? = nil) -> Self {
let loadName = nibname == nil ? "\(self)" : nibname!
return Bundle.main.loadNibNamed(loadName, owner: nil, options: nil)?.first as! Self
}
}
第六个:为什么swift要面向协议开发本质是什么
例子: 我们有3个控制器vc1 vc2 vc3 都要有showError的方法
1:第一种做法 写3个方法 是不是很恶心呢
2:第二种做法 父亲类不就行了吗 我们一下这样带来的问题 , 继承了fu类的是不是都需要这个方法