Sobes.tech

охирги кластур 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) } } охирги кластур 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
36

протокол SomeProtocol { func test() } func test1_1(қиммат: SomeProtocol) {} func test1_2(қиммат: any SomeProtocol) {} func test2_1(қиммат: some SomeProtocol) {} func test2_2<Қиммат: SomeProtocol>(қиммат: Қиммат) {} class A { func test2_2<Қиммат: SomeProtocol>(қиммат: Қиммат) { } } class B: SomeProtocol { func test() {} } class C: B {} A().test2_2(қиммат: B())

Senior
Salmon
35

Фарқияти байни кеши дар хотира ва кеши дар дискро шарҳ диҳед.

Middle+
RevolutRevolut
34

Агар экран ё навъи навро татбиқ кунед, фавран дар SwiftUI менависед, ё дар бораи интихоби байни UIKit ва SwiftUI баҳсҳо вуҷуд доранд?

Senior
Salmon
34

Дар бораи Property Wrapperҳои муфид, ки дар лоиҳа истифода бурдаед, нақл кунед

Senior
Salmon
34

Оё дар WWDC-и охирон сессияҳо/чорчубаҳои ҷолиб буданд, ки мехоҳед дар кор истифода кунед?

Senior
Salmon
34

протокол 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

// Запишете `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
32

Дар бораи истифодаи SwiftUI дар лоиҳа нақл кунед — сиёсати чӣ аст, чанд экран бо SwiftUI навишта шудааст

Senior
Salmon
31

Чӣ тавр шумо масоили муайяншударо дар назар доред, агар лоиҳа бояд дар як соат ба истеҳсолот барояд?

Senior
Uzum
30

Чаро шумо усулҳои ҷудогонаи load ва getLastCities-ро эҷод кардед, ва агар getLastCities пеш аз бор кардани маълумот даъват карда шавад, бояд чӣ рӯй диҳад?

Senior
Uzum
29

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

import UIKit протокол 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
28

Шумо мафҳуми ҳамоҳангии сохториро дар Swift чӣ гуна мефаҳмед? Task.detached ба ин мафҳум мувофиқ аст?

Senior
Salmon
27

Чаро истифодаи синфи ниҳоӣ ба ҷои синф барои иҷрои кеш?

Middle+
RevolutRevolut
20

// Хизматрасонӣ, ки дархостҳоро мефиристад (get/post), url, шаклгирии дархост вобаста ба семантика (decode/encode)

Middle+
СБЕРСБЕР
11

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