Sobes.tech

iOS

záverečná trieda Cache<T>: CacheProtocol { func getValue(forKey key: String) -> T? { return storage[key] } func fetchValue(forKey key: String, completion: @escaping (T?) -> Void) { let value = storage[key] completion(value) } } záverečná trieda CacheTests: XCTestCase { override func setUp() { super.setUp() } func testSetAndGetValue() { let cache = Cache<String>() let key: String = "key" let value: String = "value" cache.setValue(value, forKey: key) XCTAssertEqual(cache.getValue(forKey: key), value) cache.setValue(nil, forKey: key) XCTAssertTrue(cache.getValue(forKey: key) == nil) } func testCompletion() { } } CacheTests.defaultTestSuite.run()

Middle+
RevolutRevolut
37

protokol SomeProtocol { func test() } func test1_1(hodnota: SomeProtocol) {} func test1_2(hodnota: any SomeProtocol) {} func test2_1(hodnota: some SomeProtocol) {} func test2_2<Hodnota: SomeProtocol>(hodnota: Hodnota) {} class A { func test2_2<Hodnota: SomeProtocol>(hodnota: Hodnota) { } } class B: SomeProtocol { func test() {} } class C: B {} A().test2_2(hodnota: B())

Senior
Salmon
36

Porozprávaj o užitočných Property Wrapper-och, ktoré si použil v projekte

Senior
Salmon
35

Vysvetlite rozdiel medzi cache v pamäti a cache na disku.

Middle+
RevolutRevolut
34

Ak implementujete nový obrazovku alebo novú funkciu, píšete okamžite v SwiftUI, alebo sú diskusie o výbere medzi UIKit a SwiftUI?

Senior
Salmon
34

protokol CacheProtocol { associatedtype Value func setValue(_ value: Value?, forKey key: String) func getValue(forKey key: String) -> Value? func fetchValue(forKey key: String, completion: @escaping (Value?) -> Void) } final class Cache<T>: CacheProtocol { private var storage: [String: T] = [:] func setValue(_ value: T?, forKey key: String) { storage[key] = value } func getValue(forKey key: String) -> T? { return storage[key] } func fetchValue(forKey key: String, completion: @escaping (T?) -> Void) { let value = storage[key] completion(value) } } import XCTest final class CacheTests: XCTestCase { override func setUp() { super.setUp() } func testSetAndGetValue() { let cache = Cache<String>() let key: String = "key" let value: String = "value" cache.setValue(value, forKey: key) XCTAssertEqual(cache.getValue(forKey: key), value) cache.setValue(nil, forKey: key) XCTAssertTrue(cache.getValue(forKey: key) == nil) } } CacheTests.defaultTestSuite.run()

Middle+
RevolutRevolut
33

// Zapisuje `data` do súboru s názvom `file`. func writeData(_ data: Data, to file: String) { let documentDirectoryURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! let fileURL = documentDirectoryURL.appendingPathComponent(file) try? data.write(to: fileURL) } // Odstráni súbor s názvom `file`. func remove(file: String) { let documentDirectoryURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! let fileURL = documentDirectoryURL.appendingPathComponent(file) try? FileManager.default.removeItem(at: fileURL) } // Číta `Data` zo súboru s názvom `file`. Ak súbor neexistuje, vráti `nil`. func readData(from file: String) -> Data? { let documentDirectoryURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! let fileURL = documentDirectoryURL.appendingPathComponent(file) return try? Data(contentsOf: fileURL) } final class DiskCache<T>: CacheProtocol { func setValue(_ value: T?, forKey key: String) { } func getValue(forKey key: String) -> T? { } func fetchValue(forKey key: String, completion: @escaping (T?) -> Void) { } }

Middle+
RevolutRevolut
33

import UIKit protokol CacheProtocol { associatedtype Value func setValue(_ value: Value?, forKey key: String) func value(forKey key: String) -> Value? func fetchValue(forKey key: String, completion: @escaping (Value?) -> Void) }

Middle+
RevolutRevolut
32

Povej mi o uporabi SwiftUI v projektu — kakšna je politika, koliko je ekranov napisanih v SwiftUI

Senior
Salmon
31

Prečo ste vytvorili samostatné metódy load a getLastCities a čo by sa malo stať, ak sa volá getLastCities skôr, ako boli načítané údaje?

Senior
Uzum
31

Ako by ste priorizovali identifikované problémy, ak projekt musí ísť do výroby za jednu hodinu?

Senior
Uzum
31

import UIKit protocol CacheProtocol { associatedtype Value func setValue(_ value: Value?, forKey key: String) func getValue(forKey key: String) -> Value? func fetchValue(forKey key: String, completion: @escaping (Value?) -> Void) } final class Cache<T>: CacheProtocol { private var storage: [String: T] = [:] private let queue = DispatchQueue(label: "my.queue", attributes: .concurrent) func setValue(_ value: T?, forKey key: String) { queue.sync(flags: .barrier) { storage[key] = value } } func getValue(forKey key: String) -> T? { queue.sync { return storage[key] } } func fetchValue(forKey key: String, completion: @escaping (T?) -> Void) { queue.async { let value = self.storage[key] completion(value) } } }

Middle+
RevolutRevolut
28

Ako rozumieš pojmu štruktúrovaná konkurencia v Swift? Hodí sa Task.detached na tento pojem?

Senior
Salmon
27

Prečo použiť finálnu triedu namiesto triedy na implementáciu cache?

Middle+
RevolutRevolut
21

// Služba, ktorá odosiela požiadavky (get/post), url, tvorba požiadavky v závislosti od sémantiky (decode/encode)

Middle+
СБЕРСБЕР
12

enum HTTPMethod: String { case post = "POST" } enum Errors: Error { case invalidUrl case invalidQuery case invalidResponse case httpStatus(Int) } protocol MyDecoder { func decode<T: Decodable>(_: _ type: T.Type, from data: Data) throws -> T } final class NetworkService { private let session: URLSession private let encoder = JSONEncoder() private let decoder: MyDecoder init( session: URLSession = .shared, decoder: MyDecoder ) { self.session = session self.decoder = decoder } func request<Response: Decodable, Body: Encodable>( urlString: String, method: HTTPMethod, body: Body? = nil, headers: [String: String] = [:], query: [String: String] = [:] ) async throws -> Response { guard var components = URLComponents(string: urlString) else { throw Errors.invalidUrl } if !query.isEmpty { components.queryItems = query.map { URLQueryItem(name: $0.key, value: $0.value) } } guard let url = components.url else { throw Errors.invalidQuery } var request = URLRequest(url: url)

Middle+
СБЕРСБЕР
10
/206