美文网首页
swift5.0 记录(2)

swift5.0 记录(2)

作者: rhc2008 | 来源:发表于2021-05-25 19:55 被阅读0次
    
    import Foundation
    import PlaygroundSupport
    // 1. 关联类型
    // 协义只能使用关联类型,不能使用泛型
    protocol Container {
        associatedtype itemType //:Equatable  //可以指定关联 类型符号的约束
        
        mutating func append(_ item: itemType)
        var count :Int {get}
        subscript(i:Int) -> itemType {get}
        
     //   associatedtype Iterator:IteratorProtocol where Iterator.Element == itemType
    //    func makeIterator()->Iterator
    }
    
    // 让关联类型的协义遵循自身
    protocol SuffixableContainer:Container {
        associatedtype Suffix:SuffixableContainer where Suffix.itemType == itemType
    }
    
    struct IntStack: Container {
        var items =  [Int]()
        
        typealias ItemType = Int // 可以省略,可以自己推断
        mutating func append(_ item: itemType) {items.append(item) }
        var count: Int { return items.count }
        subscript(i:Int) ->ItemType {return items[i]}
    }
    
    //var intStack = IntStack()
    //intStack.append(1)
    //intStack.append(2)
    //print(intStack.count)
    //print(intStack[0])
    
    func allItemsMatch<C1:Container,C2:Container>(container:C1,anotherContainer:C2) -> Bool where C1.itemType == C2.itemType, C1.itemType : Equatable {
        if container.count != anotherContainer.count {
            return false
        }
        for i in 0..<container.count {
            if container[i] != anotherContainer[i] {
                return false
            }
        }
        return true
    }
    //var intStack = IntStack()
    //intStack.append(1)
    //var intStack1 = IntStack()
    //intStack1.append(2)
    //print(allItemsMatch(container:intStack,anotherContainer:intStack1))
    
    // 泛型下标
    extension Container {
        subscript<Indices:Sequence>(indices:Indices) -> [itemType] where Indices.Iterator.Element == Int {
            var result = [itemType]()
            for index in indices {
                result.append(self[index])
            }
            return result
        }
    }
    //var intStack = IntStack()
    //intStack.append(1)
    //intStack.append(2)
    // [(0,0),(0,1),(1,0),(1,1)]
    // print(intStack[[0,0]],intStack[[0,1]],intStack[[1,0]],intStack[[1,1]])
    //print( intStack[["2","0"]])//error: 75-111.xcplaygroundpage:66:17: error: cannot convert value of type '[String]' to expected argument type 'Int'
    
    //2.thread
    //在主线程执行完,线程不退出
    PlaygroundPage.current.needsIndefiniteExecution = true
    
    //for i in 0..<10 {Thread.detachNewThread { print(i)}}
    class ObjectThread {
        func runThread() {
            let thread = Thread(target: self, selector: #selector(threadWorker), object: nil)
            thread.start()
        }
        @objc func threadWorker(){print("threadWorker")}
    }
    //let obj = ObjectThread()
    //obj.runThread()
    
    class MyOperation:Operation {
        override func main(){
            sleep(1)
            print("in Myoperation main")
        }
    }
    class ObjectOperation {
        func test() {
    //        let operation = BlockOperation { [weak self] in
    //           self?.threadWorker()
    //        }
            let operation = MyOperation();
            operation.completionBlock = {() -> Void in
                print("completionBlock")
            }
            let queue = OperationQueue()
            queue.addOperation(operation)
        }
        @objc func threadWorker(){sleep(1);print("threadWorker")}
    }
    //let op = ObjectOperation()
    //op.test()
    //print("after invoke test")
    
    //3.GCD  https://opensource.apple.com/tarbals/libdispatch/
    let queue = DispatchQueue(label: "MyQueue", qos: DispatchQoS.default, attributes: DispatchQueue.Attributes.concurrent, autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency.inherit, target: nil)
    let queue2 = DispatchQueue(label: "MyQueue2", qos: DispatchQoS.default, attributes: DispatchQueue.Attributes.concurrent, autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency.inherit, target: nil)
    let arrayQueue = DispatchQueue(label: "MyQueue3", qos: DispatchQoS.default, attributes: DispatchQueue.Attributes.concurrent, autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency.inherit, target: nil)
    
    queue.sync {print("in  DispatchSyncQueue")}
    queue.async {sleep(1) ;print("in  DispatchAsyncQueue")}
    queue.asyncAfter(deadline: .now() + 1) { print("in asyncAfter")}
    print("after invoke DispatchQueue")
    
    let group = DispatchGroup()
    group.enter()
    queue.async { sleep(2); print("A data to req...");group.leave()}
    group.enter()
    queue.async { sleep(1);print("B data to req..."); group.leave()}
    print("group call...")
    //group.wait()  //block the data
    group.notify(queue: queue) { print("merge the data")}
    print("no block the data")
    
    var seconds = 10
    let timer = DispatchSource.makeTimerSource(flags: [], queue: queue)
    timer.schedule(deadline: .now(), repeating: 1.0)
    timer.setEventHandler {
        seconds -= 1
        if seconds < 0 { timer.cancel()}
        else { print(seconds) }
    }
    timer.resume()
    
    var lock = NSLock()
    var array = Array(1...10000)
    func getLastItem() -> Int {
    //    lock.lock()
    //    var temp:Int? = nil
    //    if array.count > 0 {
    //        temp = array[array.count - 1]
    //    }
    //    lock.unlock()
    //    return temp
    
        return arrayQueue.sync { () -> Int in
            if array.count > 0 {
                return array[array.count - 1]
            }
            return -1
        }
    }
    
    func removeLastItem() {
    //    lock.lock();
    //    array.removeLast()
    //    lock.unlock()
        let workItem = DispatchWorkItem(qos: DispatchQoS.default, flags: DispatchWorkItemFlags.barrier) {
            array.removeLast()
        }
        arrayQueue.async(execute: workItem)
    }
    
    queue.async {
        for _ in 0..<10000 {removeLastItem()}
    }
    queue2.async {
        for _ in 0..<10000 {print(getLastItem()) }
     // if let item = getLastItem() { print( getLastItem() )}
    }
    
    // 多线程其他模式:
    // promise
    // pipeline
    // master-slave
    // serial Thread confinement
    
    //4. error
    //------------------------------------------------------------------------------------------------
    enum VendingMachineError:Error {
        case invalidSelection
        case insufficientFunds(coinsNeeded:Int)
        case outOfStock
    }
     
    // 商品
    struct Item {
        var price:Int
        var count:Int
    }
    
    // 自动售货机
    class VendingMachine {
        var inventory = [
            "ctr":Item(price: 6, count: 8),
            "Chips":Item(price: 10, count: 9),
            "Breed":Item(price: 15, count: 5)
        ]
        // 投币
        var coinsDesPosited = 0
        // 售卖
        func vend(itemName:String) throws {
            defer {
                print("exit to clean")
            }
            
            guard let item = inventory[itemName] else {
                throw VendingMachineError.invalidSelection
            }
            guard item.count > 0 else {
                throw VendingMachineError.outOfStock
            }
            
            guard coinsDesPosited >= item.price else {
                throw VendingMachineError.insufficientFunds(coinsNeeded: item.price-coinsDesPosited)
            }
            
            var newItem = item
            newItem.count -= 1
            inventory[itemName] = newItem
            
            print("sell to success...")
        }
    }
    
    var machine = VendingMachine()
    machine.coinsDesPosited = 5
    do {
        try machine.vend(itemName: "Chips")
    }catch VendingMachineError.invalidSelection {
        print("no such thing")
    }catch VendingMachineError.insufficientFunds(let coninsNeeded){
        print("u need more coins \(coninsNeeded)")
    }catch VendingMachineError.outOfStock {
        print("out Of Stock")
    }catch {
        print("unexpected error")
    }
    
    
    
    
    
    //------------------------------------------------------------------------------------------------
    //5 不透明类型
    protocol Shape {
        func draw() -> String
    }
    
    struct Triangle:Shape {// 三角(形)
        func draw() -> String {
            var res = [String]()
            for len in 1...size {
                res.append(String(repeating: "*", count: len))
            }
           return res.joined(separator: "\n")
        }
        var size:Int
    }
    //print(Triangle(size: 5).draw())
    
    struct Square:Shape {
        var size:Int
        func draw() -> String {
            var res = [String]()
            for _ in 0..<size {
                res.append(String(repeating: "*", count: size))
            }
            return res.joined(separator: "\n")
        }
    }
    
    //FlippedShape confirm to Shape协议, 泛型 T 有一个约束Shape
    struct FlippedShape<T:Shape>:Shape {
        func draw() -> String {
            let res = shape.draw().split(separator: "\n")
            return res.reversed().joined(separator: "\n")
        }
        var shape:T
    }
    
    struct JoinedShape<T:Shape,U:Shape>:Shape {
        var top:T
        var bottom:U
        func draw() -> String {
            return top.draw() + "\n" + bottom.draw()
        }
    }
    
    // top:Triangle
    // mid:square
    // bottom: Triangle 反转
    //func makeTapezoid() -> JoinedShape<Triangle,JoinedShape<Square,FlippedShape<Triangle>>> { or some Shape 不透明类型
    func makeTapezoid(size:Int) -> Shape {// some Shape 不透明类型 只能返回一种特定的类型,不能跟据不同分支 条件判断 返回不同几种类型
        // 用some Shape不透明类型 ,去掉if语句
        if(size == 3) {
            return Square(size:3)
        }
        
        let t = Triangle(size: size)
        let s = Square(size: size)
        let f = FlippedShape(shape: t)
        return JoinedShape(top: t, bottom: JoinedShape(top: s, bottom:f))
    }
    //print(makeTapezoid(size:3).draw())
    
    protocol Container_v1 {
        associatedtype Item
        var count:Int{get}
        subscript(index:Int) -> Item {get}
    }
    
    //Array 遵循Container_v1 协议
    extension Array:Container_v1{}
    
    func makeProtocolContainer<T>(item:T) -> some Container_v1 { //一定要用不透明类形
        return [item]
    }
    
    //无主引用: unowned :has default value,and canot assign to nil
    
    //6 inout参数访问冲突
    // 同时读和写了
    //Simultaneous accesses to 0x10c926ff0, but modification requires exclusive access.
    //Previous access (a modification) started at  (0x10c927374).
    //Current access (a read) started at:
    var stepSize  = 1
    func increment(_ num: inout Int) {
        num += stepSize
    }
    // increment(&stepSize) // 冲突
    var copyOfStepSize = stepSize
    increment(&copyOfStepSize)
    stepSize = copyOfStepSize
    
    struct Player {
        var name:String
        var health:Int
        var eneygy:Int
        
        static let maxHealth = 10
        mutating func restoreHealth() {
            health = Player.maxHealth
        }
    }
    
    extension Player {
        mutating func shareHealth(with teammate:inout Player) {
            balance(hea1: &teammate.health,hea2: &health)
        }
        func balance(hea1:inout Int,hea2:inout Int) {}
    }
    
    var oscar = Player(name: "Oscar", health: 10, eneygy: 10)
    var maria = Player(name: "Maria", health: 5, eneygy: 10)
    oscar.shareHealth(with: &maria)
    //oscar.shareHealth(with: &oscar) // 冲突
    
    
    // 7. third lib
    //pod 'Alamofire','~> 5.5.5-rc.2'
    //pod 'SwiftyJSON','~> 4.0'
    
    //r.swift可以获取强类型、自动完成的资源,如图像、字体和段落完全类型化。
    //更少的强制转换和猜测方法将返回什么编译时检查,运行时不再有导致应用程序
    //崩溃的错误字符串自动完成,再也不用怀疑图片名字是不是复制错
    //pod 'R.swift'
    
    //pod 'MonkeyKing'//
    //MonkeyKing helps you post SNS messages to Chinese Social Networks, without their buggy SDKs
    
    //pod 'Kingfisher'
    //pod 'SnapKit','~> 5.0.0'
    
    //Dollar 是一个第三方扩展。
    //包括了。Array,Dictionary,Object,Function,Chaining
    //导入Dollar 直接使用即可
    //pod 'Dollar'
    
    //8 swift 消息派发方式
    //直接派发
    //函数表派发 Vitual table
    //消息机制派发:不管是纯Swift类还是继承NSObject 的类只要在属性和方法前面添加@objc 关键字可以使用runtime
    
    //swift runtime
    //                      原始定义      扩展
    //值类型                 直接派发     直接派发
    //协议                  函数表派发    直接派发
    //类                    函数表派发   直接派发
    //继承自NSOBject的类      函数表派发   消息机制派发
    
    //修饰符
    //final               直接派发
    //dynamic             消息机制派发
    //@objc & @nonobjc    改变在OC里的可见性
    //@inline             告许编译器可以直接派发
    
    
    //9.混编:
    //NS_SWIFT_NAME: 在OC中,重新命名在swift中的名称
    //NS_SWIFT_UNAVAILABLE ,在Swift中不可见,不能使用
    
    // 混编:
    //1.对于自定义的类而言,OC的类,不能继承Swift的类,即要混编的OC类不能是Swift类的子类
    //反过来,需要混编的Swift类可以继承自OC的类
    
    //2. swift没有宏定议的
    //#define TOOLLABAR_HEIGHT 44
    //let TOOLLABAR_HEIGHT = 44
    // 常量不变化值
    //#define SCREEN_WIDTH ([[UISCREEN mainScreen]bounds].size.width)
    //let SCREEN_WIDTH = UISCreen.mainScreen().bounds.size.width
    // 常量变化值
    //#define STATUS_BAR_HEIGHT ([UIApplication sharedApplication].statusBarFrame.size.height);
    //func STATUS_BAR_HEIGHT() -> CGFloat {
    //    return UIApplication.sharedApplication().statusBarFrame.size.height
    //}
    //带参的宏
    //#define RGB_COLOR(r,g,b) [UIColor colorWithRed:r/255.f green:g/255.f blue:b/255 alpha:1.0]
    //func RGB_COLOR(r:CGFloat,g:CGFloat,b:CGFloat) -> UIColor {
    //    return UIColor(red:r,green:g,blue:b,alpha:1.0)
    //}
    
    //3.swift的独有特性,如果要提供给OC中调用,不要使用OC中没有的特性
    //swift中有许多OC没有的特性,比如,元组为一等公民函数,还有特有的枚举类型,所以要使用的混编文件要注意Swift独有属性问题
    
    // 4.OC API和SWIFT的风格相差比较大,SWIFT调用OC的API 时可能由于数据类型等不一致无法达到预期
    //(OC方法采用C语言风格的多参类型,OR OC
    //方法返回NSNotFound,在Swift中期望返回nil),这时候就要 NS_REFINED_FOR_SWIFT了
    
    //@interface MyClass:NSObject
    //-(NSUInteger)indexOfString:(NSString*)aString NS_REFINED_FOR_SWIFT:
    //@end
    //extension MyClass {
    //    func indexOfString(aString:String!) -> Int? {
    //        let index = Int(__index(of:aString))
    //        if(index == NSNotFound) {
    //            return nil
    //        }
    //        return index
    //    }
    //}
    
    //10.
    //Carthage 主张去中心化和非侵入性
    //CocoaPods搭建了一个中心库,第三方库被收入到该中心库,所以没有收录的第三方库是不能使用CococoaPod管理的,这就是所谓的中心化思想
    //Carthage 没有这样的中心库,第三主库基本上都是从GitHub或者私有Git库中下载的,这就是去中心化
    //另外CocoaPods下载第三方库后,会将其编译成静态链接库或者动态框架文件,这种做法会修改Xcode 项目属性配置依赖关系。这就是所谓的侵入性,而Carthage 下载成功后,会将第三库编译成动态框架,由开发人员自己配置依赖关系,Carthage不会修改XCODE项目属性,这就是所谓的非侵入性
    
    //setup carthage
    
    //brew  安装 carthage
    //1> brew update
    //2> brew install carthage
    //3> 工程下创建:touch Cartfile
    //github "Alamofire/Alamofire" ~> 5.2
    //github "onevcat/Kingfisher" ~> 6.0
    //github "nixzhu/MonkeyKing"
    //github "SwiftyJSON/Alamofire-SwiftyJSON" "master"
    //github "SnapKit/SnapKit" ~> 5.0.0
    
    //4>carthage update --platform iOS
    
    //5>config:
    //Framework Search Paths:
    //$(PROJECT_DIR)/Carthage/Build/iOS
    
    //Build Phases ->run Script
    //shell ->/bin/sh:
    //usr/local/bin/carthage copy-frameworks
    
    // input files:
    //$(SRCROOT)/Carthage/Build/iOS/Alamofire.framework
    
    //xcode->file->swift packages:
    //https://github.com/Alamofire/Alamofire.git
    
    

    相关文章

      网友评论

          本文标题:swift5.0 记录(2)

          本文链接:https://www.haomeiwen.com/subject/fxgfsltx.html