Sobes.tech

პროტოკოლი 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

თუ ახალი ეკრანი ან ახალი ფუნქცია განახორციელეთ, მაშინვე დაწერთ SwiftUI-ით, თუ განხილვები არსებობს UIKit და SwiftUI შორის არჩევანის შესახებ?

Senior
Salmon
34

ბოლო WWDC-ზე საინტერესო სესია/ჩარჩოები იყო, რომლებსაც გსურთ თქვენი მუშაობაში სცადოთ?

Senior
Salmon
34

ბოლოს კლასი 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
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
32

გთხოვთ, განმარტოთ მეხსიერებაში არსებული კეში და დისკზე არსებული კეშის განსხვავება.

Middle+
RevolutRevolut
32

პროექტში გამოყენებული სასარგებლო Property Wrapper-ების შესახებ ისაუბრე

Senior
Salmon
32

// დაწერეთ `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
29

რატომ შექმენით ცალკე load და getLastCities მეთოდები, და რა უნდა მოხდეს, თუ getLastCities გამოიძახება მონაცემების ჩატვირთვამდე?

Senior
Uzum
28

როგორ დააწესებდით პრიორიტეტს იდენტიფიცირებულ საკითხებს, თუ პროექტი ერთ საათში უნდა გავიდეს წარმოებაში?

Senior
Uzum
28

როგორ ხვდებით სტრუქტურირებული თანხვედრის ტერმინს Swift-ში? შეესაბამება თუ არა Task.detached ამ კონცეფციას?

Senior
Salmon
27

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
27

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
27

რატომ გამოიყენოთ საბოლოო კლასი კეშის განსახორციელებლად კლასი ნაცვლად?

Middle+
RevolutRevolut
19

// სერვისი, რომელიც აგზავნის მოთხოვნებს (get/post), url, მოთხოვნის ფორმირება სემანტიკის მიხედვით (decode/encode)

Middle+
СБЕРСБЕР
10

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