Техскрининг
Задача 1
struct ContentItem: Decodable {
let company_name: String
let company_description: String
let company_revenue: Int
}
struct ContentItemView: View {
let item: ContentItem
var body: some View {
ZStack {
Text(item.company_name)
Text(item.company_description)
}
}
}
class DataProvider {
func loadItems(searchQuery: String?, _ callback: @escaping ([ContentItem]?, Error?) -> Void) {
let url = URL(string: "url" + searchQuery) // assume URL is always valid
URLSession.shared.dataTask(with: url) { data, response, error in
DispatchQueue.global(qos: .background).async {
if let error {
callback(nil, error)
}
guard let dataCompanies = try? JSONDecoder().decode([ContentItem].self, from: data) else {
return
callback(nil, error)
}
let companies: [ContentItem] = dataCompanies
callback(companies, nil)
}
}.resume()
}
}
class ContentViewModel {
@Binding var inputSearchText: String = ""
@State var outputItems: [ContentItem] = []
init() {
$inputSearchText
.sink(receiveValue: { [weak self] inputSearchText in
self.onAppear(searchQuery: inputSearchText)
})
}
func onAppear(searchQuery: String) {
let dataProvider = DataProvider()
dataProvider.loadItems(searchQuery: inputSearchText) { result, error in
if result != nil {
self.outputItems = result!
}
}
}
}
struct ContentView: View {
var viewModel = ContentViewModel()
var body: some View {
VStack {
TextField("search", text: viewModel.inputSearchText)
.padding()
ScrollView {
VStack {
ForEach(viewModel.outputItems, id: .id) { item in
ContentItemView(item: item)
}
}
}
}
.onChange(of: viewModel.inputSearchText) { inputSearchText in
viewModel.onAppear(inputSearchText: inputSearchText)
}
}
}
Задача 2
Что выведет, без рефакторинга
func foo() {
print(1)
DispatchQueue.main.async {
print(2)
DispatchQueue.global(qos: .background).async {
print(3)
DispatchQueue.global(qos: .background).sync {
print(4)
}
print(5)
}
print(6)
}
print(7)
}
Задача 3
Что выведет
var a = [1, 2, 3]
for i in a {
a = [4, 5, 6]
print(i)
}