美文网首页
KF 中的语法

KF 中的语法

作者: 大斑马小斑马 | 来源:发表于2021-06-11 11:21 被阅读0次
  • kf 的其中之一调用方法


    简单截图

1、 第一个参数 Source?
这是一个可选枚举啊 单单这个参数就很牛逼了 知识点非常多

        kf.setImage(with: <#T##Source?#>,
                    placeholder: <#T##Placeholder?#>,
                    options: <#T##KingfisherOptionsInfo?#>,
                    progressBlock: <#T##DownloadProgressBlock?##DownloadProgressBlock?##(Int64, Int64) -> Void#>,
                    completionHandler: <#T##((Result<RetrieveImageResult, KingfisherError>) -> Void)?##((Result<RetrieveImageResult, KingfisherError>) -> Void)?##(Result<RetrieveImageResult, KingfisherError>) -> Void#>)
 
// 声明一个枚举  这是一个大范围的枚举(为什么这么说 不要着急 接着看下面)
public enum Source {
    // 在大枚举中又套了一个小枚举 (这个枚举干啥用 不知道 回头明白了再补上)
    public enum Identifier {
      // 知识点 类型别名  typealias  (typealias Value = UInt 这句话就是说给UInt 又起了一个名字叫 Value,他们两个是同一个人)  
      // 我不想吐槽这玩意 说实话 项目开发的话 这玩意 就没几个人用 写一个详细的注释 他不香嘛
      // 类型别名还可以这样玩  typealias A = [B] or  typealias C = {[D]} 这个就有意思了 这样数组字典可以看成一个实体来用了 牛逼了
        public typealias Value = UInt
        static var current: Value = 0
        static func next() -> Value {
            current += 1
            return current
        }
    }

    // 这里就有意思了 这领个case 都有参数 而这两个参数都是一个协议 Resource 、ImageDataProvider 都是一个协议 牛逼吧  太他妈强了 
    case network(Resource)
    case provider(ImageDataProvider)
    
    // 这里呢声明了一个属性 cacheKey 具体怎么用还不清楚
    public var cacheKey: String {
        switch self {
        case .network(let resource): return resource.cacheKey
        case .provider(let provider): return provider.cacheKey
        }
    }
    // 这里呢一样 一个属性 url 具体怎么用还不清楚
    public var url: URL? {
        switch self {
        case .network(let resource): return resource.downloadURL
        case .provider(let provider): return provider.contentURL
        }
    }
}

// Source 的扩展
extension Source {
     // 也是扩充了两个属性 但是这两个属性 有意思 都是一个遵循某个协议的参数
    var asResource: Resource? {
        guard case .network(let resource) = self else {
            return nil
        }
        return resource
    }
    // 也是扩充了两个属性 但是这两个属性 有意思 都是一个遵循某个协议的参数
    var asProvider: ImageDataProvider? {
        guard case .provider(let provider) = self else {
            return nil
        }
        return provider
    }
}
 

1.1、好了接着回来看着第一个参数,第一个参数是URL(实际传值),他对应的是asResource 是这个属性,因为URL 只遵循了一个协议 Resource

public protocol Resource {
    // 图片下载的字符串
    var cacheKey: String { get }
    // 图片下载的地址
    var downloadURL: URL { get }
}
extension Resource {
    public func convertToSource() -> Source {
        return downloadURL.isFileURL ?
            .provider(LocalFileImageDataProvider(fileURL: downloadURL, cacheKey: cacheKey)) :
            .network(self)
    }
}
public struct ImageResource: Resource {
    public init(downloadURL: URL, cacheKey: String? = nil) {
        self.downloadURL = downloadURL
        self.cacheKey = cacheKey ?? downloadURL.absoluteString
    }
    public let cacheKey: String
    public let downloadURL: URL
}
// 注意看这里 URL 遵循了这个协议
extension URL: Resource {
    public var cacheKey: String { return absoluteString }
    public var downloadURL: URL { return self }
}

2、 草他妹的看错了 忽略上面的逻辑 重新开始


截屏2021-06-07 下午3.59.48.png

2、第一个参数是 Resource? 传递过来的是一个url(实际上)
2.1 这里不得不先说一下两个协议 Resource、ImageDataProvider

 // 首先 Resource、ImageDataProvider 这两个协议是干什么用的
  1、Resource :资源
  2、ImageDataProvider:图片数据提供者
  3、LocalFileImageDataProvider 本地图片提供者 遵循 ImageDataProvider 
  4、KingfisherParsedOptionsInfo 结构体 解析信息
  5、KingfisherManager 结构体 管理 
  6、RetrievingContext
  7、RetryContext
  8、Placeholder  也是协议
  9、DownloadTask 结构体
  10、WrappedTask 枚举


2.2 插播下小插曲

    func loadDataDemo1(_ source:MNEResource?, _ str:String,_ str2:String){
        print("###############################################################")
        
        // 方法中套方法 然后在该方法中调用此方法 此处适用什么地方呢 适用于 警告 当我门一个方法中行为过长 而没办法拆分的时候 或者说拆除去不太好 这个更能理解上下文 或者将某些东西归位一类的时候 感觉这个可用性不大 还不如加注释拆分呢
        func insideFunc(_ str:String){
            print("牛逼不\(str)")
        }
        // 有点小牛逼的感觉 总感觉实用性不大 
        insideFunc(str2)
    }

2.3 插播下小插曲
枚举 、结构体属于值类型存储于栈中 而单利属于引用类型 存储于堆中 我觉得枚举完全可以取代单利

相关文章

  • KF 中的语法

    kf 的其中之一调用方法简单截图 1、 第一个参数 Source?这是一个可选枚举啊 单单这个参数就很牛逼了 知识...

  • KF之路

    小宝十个月了,我也躺了十个月,产后椎间盘突出的面积大了许多,压迫下肢神经无法正常走路。看着街上自由穿梭的人们,男女...

  • Python的__init__.py文件小议(一)

    python 中的 init 文件http://www.2cto.com/kf/201204/129388.htm...

  • Kingfisher 源码阅读以及部分小收获

    Kingfisher 部分收获: Kingfisher的 kf 写法同样是链式编程, 在SnapKit中,view...

  • 交易所入冬,看KF如何花式破冰

    2018年9月,价值千万的二字母域名KF.COM正式上线!KF是一个全新的虚拟货币交易所,总部位于世界第四大金融中...

  • iOS Swift 写一个自己的命名空间

    介绍 比如写一个 lg 为后缀的命名空间,类似于 RxSwift 中的 rx, Kingfisher 中的 kf,...

  • 来自KF团队的心声

    来自CoinMarketCap的数据显示:全球交易所数量已经超过1.2万家,流通的数字Token超过1500种。新...

  • swift kf_xxx 转向了kf.xxx风格

    突然之间感觉自己swift一点都不知道根本就生存不下去,所以赶紧看看swift,先看看源码吧(语法很重要),看到了...

  • 致KF小分队

    也没发生什么大事,就是有些话想对你们说。 首先,就是比较抱歉,有时候忍不住在群里多说了几句话导致刷屏。但我已经很努...

  • properties、gradle、manifest

    Android中如何基于Gradle参数化打不同环境安装包https://www.2cto.com/kf/2017...

网友评论

      本文标题:KF 中的语法

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