This commit is contained in:
Михаил Капелько
2023-12-30 10:13:52 +03:00
parent 47f8109c0b
commit 8bf84d9449
18 changed files with 22 additions and 82 deletions

View File

@@ -8,9 +8,6 @@ public extension Bus {
key == v.key,
let value = v.value as? T
else {
if key == "MeetupId.finishLoading" {
/**/print("ИГР Bus.convertKV failed k/v/T: '\(key)'/'\(v)'/'\(type(of: T.self))'")
}
return nil
}
return (key, value)

View File

@@ -20,7 +20,6 @@ extension Bus {
var subscriptions = [AnyCancellable]()
func send(_ key: String, _ value: Any) {
/**/print("ИГР BusS.send key/value: '\(key)'/'\(value)'")
events.send((key, value))
}
}

View File

@@ -0,0 +1,9 @@
extension BusUI {
/// Пропускаем лишь значения от UI
///
/// - Returns: Значение без префиксов "a:"/"u:"
static func onlyUIText(_ s: String) -> String? {
guard s.hasPrefix("u:") else { return nil }
return String(s.dropFirst(2))
}
}

View File

@@ -0,0 +1,16 @@
import Combine
extension BusUI {
public final class Button: ObservableObject {
public let v = PassthroughSubject<Void, Never>()
var subscriptions = [AnyCancellable]()
public init(_ key: String) {
Bus.send(
key,
v.map { true }.eraseToAnyPublisher(),
sub: &subscriptions
)
}
}
}

View File

@@ -0,0 +1,29 @@
import Combine
import SwiftUI
extension BusUI {
public final class TextField: ObservableObject {
@Published public var v = "a:"
var subscriptions = [AnyCancellable]()
public init(
_ textApp: String,
_ textUI: String
) {
Bus.send(
textUI,
$v
.removeDuplicates()
.compactMap(onlyUIText)
.eraseToAnyPublisher(),
sub: &subscriptions
)
Bus.receive(
[textApp],
{ [weak self] (_, v: String) in self?.v = "a:\(v)" },
sub: &subscriptions
)
}
}
}

View File

@@ -0,0 +1,22 @@
import Foundation
extension BusUI {
public final class TextFieldSource: Formatter {
/// Выдаём для отображения очищенную от источника строку.
public override func string(for obj: Any?) -> String? {
guard let str = obj as? String else { return nil }
return String(str.dropFirst(2))
}
/// Выдаём для использования кодом строку с указанием источника
/// в виде пользователя `u:`
public override func getObjectValue(
_ obj: AutoreleasingUnsafeMutablePointer<AnyObject?>?,
for string: String,
errorDescription error: AutoreleasingUnsafeMutablePointer<NSString?>?
) -> Bool {
obj?.pointee = "u:\(string)" as AnyObject
return true
}
}
}

View File

@@ -0,0 +1,20 @@
import Combine
extension BusUI {
public final class Value<T>: ObservableObject {
@Published public var v: T
var subscriptions = [AnyCancellable]()
public init(
_ key: String,
_ defaultValue: T
) {
v = defaultValue
Bus.receive(
[key],
{ [weak self] (_, v: T) in self?.v = v },
sub: &subscriptions
)
}
}
}

View File

@@ -0,0 +1 @@
public enum BusUI { }

View File

@@ -1,13 +1,13 @@
Pod::Spec.new do |s|
s.name = 'BusX'
s.version = '2023.12.28'
s.version = '2023.12.30'
s.license = 'IVCS'
s.summary = 'Шина общения элементов приложения'
s.homepage = 'IVCS'
s.author = 'IVCS'
s.source = { :git => 'https://fake.com/FAKE.git', :tag => s.version }
s.source_files = 'src/**/*.swift'
s.source_files = '**/**/*.swift'
s.swift_version = '5.2'
s.ios.deployment_target = '14.0'

View File

@@ -1,30 +0,0 @@
import Combine
public extension Bus {
final class Receiver<T> {
var subscriptions = [AnyCancellable]()
public init(
_ keys: Set<String>,
_ handler: @escaping ((String, T) -> Void),
opt: [Option] = []
) {
Bus.receive(keys, handler, opt: opt, sub: &subscriptions)
}
}
}
import Combine
public extension Bus {
final class Sender<T> {
var subscriptions = [AnyCancellable]()
public init(
_ key: String,
_ node: AnyPublisher<T, Never>,
opt: [Option] = []
) {
Bus.send(key, node, opt: opt, sub: &subscriptions)
}
}
}