KeyPath

  1. struct Song {
  2. var name: String
  3. var genre: String
  4. }
  5. var favoriteSong = Song(name: "小幸運", genre: "抒情")
  6. print(favoriteSong.name)
  7. //使用keypath读取属性
  8. let name = \Song.name
  9. print(favoriteSong[keyPath: name])
  10. print(favoriteSong[keyPath: \Song.name])

name的类型是
class WritableKeyPath : KeyPath
Root可以理解为类,value理解为属性类型

name的类型就是WritableKeyPath

@propertyWrapper

https://www.swiftbysundell.com/articles/property-wrappers-in-swift/
一个struct或者class,必须包含一个wrappedValue

  1. struct SettingsViewModel {
  2. @UserDefaultsBacked<Bool>(key: "mark-as-read")
  3. var autoMarkMessagesAsRead = true
  4. @UserDefaultsBacked<Int>(key: "search-page-size")
  5. var numberOfSearchResultsPerPage = 20
  6. }
  1. struct SettingsViewModel {
  2. @UserDefaultsBacked<Bool>(key: "mark-as-read", storage: .shared)
  3. var autoMarkMessagesAsRead
  4. @UserDefaultsBacked<Int>(key: "search-page-size", storage: .shared)
  5. var numberOfSearchResultsPerPage
  6. }

编译器可以根据包裹器中wrapper类型(范型)自动识别出变量类型,所以autoMarkMessagesAsRead后面不用加Bool

再次改进

  1. @propertyWrapper struct UserDefaultsBacked<Value> {
  2. var wrappedValue: Value {
  3. get {
  4. let value = storage.value(forKey: key) as? Value
  5. return value ?? defaultValue
  6. }
  7. set {
  8. storage.setValue(newValue, forKey: key)
  9. }
  10. }
  11. private let key: String
  12. private let defaultValue: Value
  13. private let storage: UserDefaults
  14. init(wrappedValue defaultValue: Value,
  15. key: String,
  16. storage: UserDefaults = .standard) {
  17. self.defaultValue = defaultValue
  18. self.key = key
  19. self.storage = storage
  20. }
  21. }

sqlite3

associatedtype

协议里面使用的范型

promisekit

获取当前钱包
IOWalletStore - currentWallet

map
then
done
catch

Guarantee

Guarantee 永远不会失败,所以不能被 rejected。

  1. func fetch() -> Promise<String> {
  2. return Guarantee { seal in
  3. fetch { result in
  4. seal(result)
  5. }
  6. }
  7. }

RXSwift

核心
https://beeth0ven.github.io/RxSwift-Chinese-Documentation/content/rxswift_core.html

do

当 Observable 产生某些事件时,执行某个操作
当 Observable 的某些事件产生时,你可以使用 do 操作符来注册一些回调操作。这些回调会被单独调用,它们会和 Observable 原本的回调分离。

PublishSubject (订阅后,发出后才接受元素)

将对观察者发送订阅后产生的元素,而在订阅前发出的元素将不会发送给观察者。如果你希望观察者接收到所有的元素,你可以通过使用 Observable 的 create 方法来创建 Observable,或者使用 ReplaySubject。

  1. let disposeBag = DisposeBag()
  2. let subject = PublishSubject<String>()
  3. subject
  4. .subscribe { print("Subscription: 1 Event:", $0) }
  5. .disposed(by: disposeBag)
  6. subject.onNext("🐶")
  7. subject.onNext("🐱")
  8. subject
  9. .subscribe { print("Subscription: 2 Event:", $0) }
  10. .disposed(by: disposeBag)
  11. subject.onNext("🅰️")
  12. subject.onNext("🅱️")

ReplaySubject (全部元素)

将对观察者发送全部的元素,无论观察者是何时进行订阅的。

BehaviorSubject (订阅后,立即拿到最新元素)

当观察者对 BehaviorSubject 进行订阅时,它会将源 Observable 中最新的元素发送出来(如果不存在最新的元素,就发出默认元素)。然后将随后产生的元素发送出来。

订阅后能拿到最新值
如果源 Observable 因为产生了一个 error 事件而中止, BehaviorSubject 就不会发出任何元素,而是将这个 error 事件发送出来。

  1. let disposeBag = DisposeBag()
  2. let subject = BehaviorSubject(value: "🔴")
  3. subject
  4. .subscribe { print("Subscription: 1 Event:", $0) }
  5. .disposed(by: disposeBag)
  6. subject.onNext("🐶")
  7. subject.onNext("🐱")
  8. subject
  9. .subscribe { print("Subscription: 2 Event:", $0) }
  10. .disposed(by: disposeBag)
  11. subject.onNext("🅰️")
  12. subject.onNext("🅱️")
  13. subject
  14. .subscribe { print("Subscription: 3 Event:", $0) }
  15. .disposed(by: disposeBag)
  16. subject.onNext("🍐")
  17. subject.onNext("🍊")

BehaviorRelay (最新元素)

BehaviorRelay 就是 BehaviorSubject 去掉终止事件 onError 或 onCompleted。

  1. let disposeBag = DisposeBag()
  2. let relay = BehaviorRelay(value: "🔴")
  3. relay
  4. .subscribe { print("Event:", $0) }
  5. .disposed(by: disposeBag)
  6. relay.accept("🐶")
  7. relay.accept("🐱")

RxTableViewSectionedReloadDataSource

rx关联tableview

Driver 是一种特殊的 Observable。它有3个特点:

  1. 不会产生 error 事件
  2. 一定在主线程监听(MainScheduler)
  3. 共享状态变化(shareReplayLatestWhileConnected)

    Bech32

    web3的相关学习
    xrc20获取信息有一步转化?
    具体代码contract.ethAddress

    JSONRPCrequest

学习iotext ios源代码
DappsRiskRepo
搞得我不大明白