KeyPath
struct Song {
var name: String
var genre: String
}
var favoriteSong = Song(name: "小幸運", genre: "抒情")
print(favoriteSong.name)
//使用keypath读取属性
let name = \Song.name
print(favoriteSong[keyPath: name])
print(favoriteSong[keyPath: \Song.name])
name的类型是
class WritableKeyPath
Root可以理解为类,value理解为属性类型
name的类型就是WritableKeyPath
@propertyWrapper
https://www.swiftbysundell.com/articles/property-wrappers-in-swift/
一个struct或者class,必须包含一个wrappedValue
struct SettingsViewModel {
@UserDefaultsBacked<Bool>(key: "mark-as-read")
var autoMarkMessagesAsRead = true
@UserDefaultsBacked<Int>(key: "search-page-size")
var numberOfSearchResultsPerPage = 20
}
struct SettingsViewModel {
@UserDefaultsBacked<Bool>(key: "mark-as-read", storage: .shared)
var autoMarkMessagesAsRead
@UserDefaultsBacked<Int>(key: "search-page-size", storage: .shared)
var numberOfSearchResultsPerPage
}
编译器可以根据包裹器中wrapper类型(范型)自动识别出变量类型,所以autoMarkMessagesAsRead后面不用加Bool
再次改进
@propertyWrapper struct UserDefaultsBacked<Value> {
var wrappedValue: Value {
get {
let value = storage.value(forKey: key) as? Value
return value ?? defaultValue
}
set {
storage.setValue(newValue, forKey: key)
}
}
private let key: String
private let defaultValue: Value
private let storage: UserDefaults
init(wrappedValue defaultValue: Value,
key: String,
storage: UserDefaults = .standard) {
self.defaultValue = defaultValue
self.key = key
self.storage = storage
}
}
sqlite3
associatedtype
协议里面使用的范型
promisekit
获取当前钱包
IOWalletStore - currentWallet
map
then
done
catch
Guarantee
Guarantee 永远不会失败,所以不能被 rejected。
func fetch() -> Promise<String> {
return Guarantee { seal in
fetch { result in
seal(result)
}
}
}
RXSwift
核心
https://beeth0ven.github.io/RxSwift-Chinese-Documentation/content/rxswift_core.html
do
当 Observable 产生某些事件时,执行某个操作
当 Observable 的某些事件产生时,你可以使用 do 操作符来注册一些回调操作。这些回调会被单独调用,它们会和 Observable 原本的回调分离。
PublishSubject (订阅后,发出后才接受元素)
将对观察者发送订阅后产生的元素,而在订阅前发出的元素将不会发送给观察者。如果你希望观察者接收到所有的元素,你可以通过使用 Observable 的 create 方法来创建 Observable,或者使用 ReplaySubject。
let disposeBag = DisposeBag()
let subject = PublishSubject<String>()
subject
.subscribe { print("Subscription: 1 Event:", $0) }
.disposed(by: disposeBag)
subject.onNext("🐶")
subject.onNext("🐱")
subject
.subscribe { print("Subscription: 2 Event:", $0) }
.disposed(by: disposeBag)
subject.onNext("🅰️")
subject.onNext("🅱️")
ReplaySubject (全部元素)
将对观察者发送全部的元素,无论观察者是何时进行订阅的。
BehaviorSubject (订阅后,立即拿到最新元素)
当观察者对 BehaviorSubject 进行订阅时,它会将源 Observable 中最新的元素发送出来(如果不存在最新的元素,就发出默认元素)。然后将随后产生的元素发送出来。
订阅后能拿到最新值
如果源 Observable 因为产生了一个 error 事件而中止, BehaviorSubject 就不会发出任何元素,而是将这个 error 事件发送出来。
let disposeBag = DisposeBag()
let subject = BehaviorSubject(value: "🔴")
subject
.subscribe { print("Subscription: 1 Event:", $0) }
.disposed(by: disposeBag)
subject.onNext("🐶")
subject.onNext("🐱")
subject
.subscribe { print("Subscription: 2 Event:", $0) }
.disposed(by: disposeBag)
subject.onNext("🅰️")
subject.onNext("🅱️")
subject
.subscribe { print("Subscription: 3 Event:", $0) }
.disposed(by: disposeBag)
subject.onNext("🍐")
subject.onNext("🍊")
BehaviorRelay (最新元素)
BehaviorRelay 就是 BehaviorSubject 去掉终止事件 onError 或 onCompleted。
let disposeBag = DisposeBag()
let relay = BehaviorRelay(value: "🔴")
relay
.subscribe { print("Event:", $0) }
.disposed(by: disposeBag)
relay.accept("🐶")
relay.accept("🐱")
RxTableViewSectionedReloadDataSource
rx关联tableview
Driver 是一种特殊的 Observable。它有3个特点:
- 不会产生 error 事件
- 一定在主线程监听(MainScheduler)
- 共享状态变化(shareReplayLatestWhileConnected)
Bech32
web3的相关学习
xrc20获取信息有一步转化?
具体代码contract.ethAddressJSONRPCrequest
学习iotext ios源代码
DappsRiskRepo
搞得我不大明白