Sobes.tech

Ako implementirate novi ekran ili novu funkciju, odmah pišete na SwiftUI, ili postoje diskusije o izboru između UIKit i SwiftUI?

Senior
Salmon
26

Ispričaj o korisnim Property Wrapper-ima koje si koristio u projektu

Senior
Salmon
26

Ispričaj više o svom posljednjem projektu — modulu fotogalerije na Avitu, za koji si bio odgovoran (kratkoročni najam, obrazac za rezervaciju itd.)

Senior
Salmon
26

Self -> Zadatak -> (snažan) Self .... Назад -> View desinit -> View model deinit?

Senior
Salmon
25

Zašto ste odabrali rečnik kao skladište keš memorije?

Middle+
RevolutRevolut
25

završna klasa 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) } } završna klasa 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
25

Kako shvataš termin strukturirana konkurentnost u Swift-u? Da li Task.detached odgovara ovom pojmu?

Senior
Salmon
24

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
24

Zašto ste kreirali odvojene metode load i getLastCities, i šta bi trebalo da se desi ako se getLastCities pozove pre nego što su podaci učitani?

Senior
Uzum
23

Koliko ti pomažu alati veštačke inteligencije (Cursor, Proxyman itd.) da budeš produktivniji na poslu?

Senior
Salmon
23

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
23

Објасните разлику између кеша у меморији и кеша на диску.

Middle+
RevolutRevolut
22

// Запише `data` у фајл под именом `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) } // Уклања фајл под именом `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) } // чита `Data` из фајла под именом `file`. Ако фајл не постоји, враћа `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
21

Kako biste prioritetizovali identifikovane probleme ako projekat mora ići u proizvodnju za sat vremena?

Senior
Uzum
19

Zašto koristiti final klasu umesto klase za implementaciju keš memorije?

Middle+
RevolutRevolut
16

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+
СБЕРСБЕР
7

// Servis koji šalje zahteve (get/post), url, formiranje zahteva u zavisnosti od semantike (decode/encode)

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