В тази статия разгледах 40 въпроса | Бързо програмиране

1. Какво е извод за тип?

Накратко това е способност за бързина. Не винаги е необходимо да пишете типове променливи и константи, които правите във вашия код. Например :

// swift know its Int type
var age = 40 // Int 
// You dont need to tell them always like below
var age : Int = 40

2. Какво е Generics?

Общият код ви позволява да пишете гъвкави, многократно използвани функции и типове, които могат да работят с всеки тип, в зависимост от изискванията, които дефинирате.

Разбиране с пример:

Да предположим, че искате да смените стойности от тип Int, нека напишем негенерични функции:

func swapTwoInts(_ a: inout Int, _ b: inout Int) {
    let temporaryA = a
    a = b
    b = temporaryA
}var num1 = 4
var num2 = 5
swapTwoInts(&num1 , &num2)

Сега, да предположим, че искате да размените две двойни стойности или две низови стойности, ще трябва да напишете друга функция за това, тъй като горната функция приема само за тип Int.

Какво ще стане, ако имаме функция, която приема всякакъв тип стойности и ги разменя, това е, което прави generic.

Сега нека направим същото нещо с обща функция:

func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
    let temporaryA = a
    a = b
    b = temporaryA
}
var num1 = 3
var num2 = 4
swapTwoValues(&num1 , &num2)var str1 = "sdf"
var str2 = "dafdf"
swapTwoValues(&str1 , &str2)

Сега можете да разменяте всеки тип стойности, не е необходимо да пишете различна функция, за да разменяте различни различни типове стойности.

  • T е контейнер, наричан като параметър на типа.

Използваме масив в swift, който също е общ тип

  • Масив ‹Елемент› , Речник‹Ключ , Стойност›

3. Какво представляват протоколите?

Това е план на методи, свойства и други изисквания, които отговарят на конкретна задача и може да бъде приет от клас, структура или изброяване.

Протоколът не включва никаква реализация !!!!

Типът, който приема протокола, трябва да има всички методи, които присъстват в дадения протокол. И това действие се нарича протокол за съответствие .

Синтаксисът му изглежда така:

protocol Vehicle {
  func accelerate()
  func stop()
}class Unicycle : Vehicle {
  var peddling = false
  func accelerate(){
    peddling = true
  }
  func stop() {
    peddling = false
  }
}

4. Какво представляват кортежите?

Понякога данните идват по двойки или тройки. Пример за това е двойка (x, y) координати върху 2D мрежа. По същия начин, набор от координати на 3D решетка се състои от x-стойност, y-стойност и z-стойност. В Swift можете да представите такива свързани данни по много прост начин чрез използването на кортеж.

let coordinates: (Int, Int) = (2, 3)

5. Какво ще кажете за променливостта в Swift?

Constant(let) са постоянни в swift, а variable(var) варират.

6. Какво представляват индексите?

С индекси можете бързо да получите достъп до членовете на колекциите.

Долният индекс се състои от:

  • Името на колекцията, като scores
  • Две квадратни скоби [ и ]
  • Ключ или индекс в скобите

По подразбиране можете да използвате индекси с масиви, речници, колекции, списъци и последователности. Можете също да внедрите свой собствен с функцията subscript.

subscript(parameterList) -> ReturnType {
 get {
 // return someValue of ReturnType
 }
 set(newValue) {
 // set someValue of ReturnType to newValue
 }

7. Какво е опция?

Опциите са решението на Swift за проблема с представянето както на стойност, така и на липсата на стойност. По избор е разрешено да съдържа стойност или нула.

8. По какви начини бихте могли да разопаковате опция?

Можем да разопаковаме всяка опция по следните начини:

  1. Чрез обвързване по избор
  2. Чрез принудително разопаковане
  3. По изявление на охраната
  4. От Nil Coalescing

Незадължително обвързване (ако е разрешено)

Неговият най-лесен начин да разопаковате опция.

var authorName : String? = "Mohd Yasir"if let authorName == authorName {
    print("Author name is \(authorName)")
else{
    print("No Author Name")
}

Чрез принудително разопаковане

За принудително разопаковане използваме “!” .

var authorName : String? = "Mohd Yasir"
print("Auhor name : \(authorName!)")

Изявление на охраната

Понякога искате да проверите условие и да продължите да изпълнявате функция само ако условието е вярно, като например когато използвате опции. Представете си функция, която извлича някои данни от мрежата. Това извличане може да се провали, ако мрежата не работи. Обичайният начин за капсулиране на това поведение е използването на опция, която има стойност, ако извличането е успешно, и нула в противен случай.

Swift има полезна и мощна функция, която да ви помогне в ситуации като тази: изявлението за защита.

func testingGuard( _ name : String?){
    guard let unrappedname = name else {
        print("You dont entered any name")
        return 
    }
    print("Hello , \(unrappedname)")
}

Нулево сливане

let name = String? = nil
let unwrappedName = name5 ?? "Unkonwn"

9. Какъв вид разпределение на паметта се извършва в Swift?

Накратко стек и куп

Когато създадете референтен тип като клас, системата съхранява действителния екземпляр в област от паметта, известна като купчина. Екземпляри на тип стойност като структурасе намират в област от паметта, наречена стек.

10. Каква е разликата между стековата и купчината памет?

  • Системата използва стека, за да съхранява всичко в непосредствената нишка на изпълнение; той се управлява и оптимизира строго от процесора. Когато функция създава променлива, стекът съхранява тази променлива и след това я унищожава, когато функцията излезе. Тъй като стекът е толкова строго организиран, той е много ефективен и следователно доста бърз.
  • Системата използва купчината, за да съхранява екземпляри на референтни типове. Купчината обикновено е голям набор от памет, от който системата може да изисква и динамично да разпределя блокове памет. Lifetime е гъвкав и динамичен. Купчината не унищожава автоматично своите данни, както прави стекът; е необходима допълнителна работа за това. Това прави създаването и премахването на данни в купчината по-бавен процес в сравнение със стека.

11. Какво е параметър In-Out?

Функционалните параметри са константи по подразбиране, което означава, че не могат да бъдат променяни. За да илюстрирате тази точка, разгледайте следния код:

func incrementAndPrint(_ value: Int) {  
    value += 1  
    print(value) 
}

Това води до грешка:

Left side of mutating operator isn't mutable: 'value' is a 'let' constant

Поведение, известно като копиране при копиране, извеждане или извикване по стойност на резултата. Правите го така:

func incrementAndPrint(_ value: inout Int) {  
    value += 1 
    print(value) 
}

inout преди типа параметър показва, че този параметър трябва да бъде копиран, това локално копие да се използва във функцията и да се копира обратно, когато функцията се върне.

амперсанд (&)

Трябва да направите лека корекция на извикването на функцията, за да завършите този пример. Добавете амперсанд (&) преди аргумента, което изяснява на сайта за повикване, че използвате копиране в копиране на изход:

var value = 5 
incrementAndPrint(&value) 
print(value)

12. Каква е разликата между синхронен и асинхронен?

Асинхронно означава, че можете да изпълнявате няколко неща наведнъж и не е нужно да завършите изпълнението на текущото нещо, за да преминете към следващото. Синхронно основно означава, че можете да изпълнявате само едно нещо наведнъж.

13. Как можете да предавате данни от един ViewController към друг?

Можете да предавате данни между контролери за изглед в Swift по 6 начина:

  1. Чрез използване на свойство на екземпляр (A → B)
  2. Чрез използване на последователности (за Storyboards)
  3. Чрез използване на свойства и функции на екземпляр (A ← B)
  4. Чрез използване на модела на делегиране
  5. Чрез използване на манипулатор за затваряне или завършване
  6. Чрез използване на NotificationCenter и модела Наблюдател

14. Какво е Completion Handler в Swift?

Манипулаторът за завършване е затваряне („самостоятелен блок от функционалност, който може да се предава и използва във вашия код“). Той се предава на функция като аргумент и след това се извиква, когато тази функция е готова.

Смисълът на манипулатора на завършване е да каже каквото и да извиква тази функция, че е направено и по желание да му даде някои данни или грешка. Понякога те се наричат ​​обратни извиквания, тъй като те извикват обратно към каквото и да се нарича функцията, в която се намират. Пример:

import UIKitlet firstVC = UIViewController()
let nextVC = UIViewController()firstVC.present(nextVC, animated: true, completion: { () in print("Welcome") })

15. Какво използва компилаторът Swift?

Компилаторът Swift използва LLVM.

16. Какво е Lazy в Swift?

Казано просто „Мързеливо съхранено свойство е свойство, чиято първоначална стойност не се изчислява до първото използване.

17. Обяснете основните данни?

~Документация на Apple

  • Това е рамка 💯

Apple казва: „Използвайте Core Data, за да запазите постоянните данни на приложението си за офлайн употреба, да кеширате временни данни и да добавите функция за отмяна към приложението си на едно устройство.“ 😮

Основните данни ви дават следните функции: постоянство, отмяна и повторение на индивидуални или групови промени, задачи за фонови данни, синхронизиране на изгледи, създаване на версии и миграция и т.н.

Създаване на основен модел на данни

Първата стъпка в работата с Core Data е създаването на файл с модел на данни. Тук дефинирате структурата на обектите на вашето приложение, включително техните типове обекти, свойства и връзки.

Можете да създадете основен модел на данни, докато създавате проект, като поставите отметка в квадратчето „използване на основни данни“.

Основен стек от данни

След като създадете файл с модел на данни, настройте класовете, които съвместно поддържат моделния слой на вашето приложение. Тези класове се наричат ​​колективно стек от основни данни.

Има няколко основни компонента на данните:

  • Екземпляр на NSManagedObjectModel представлява моделния файл на вашето приложение, описващ типовете, свойствата и връзките на вашето приложение.
  • Екземпляр на NSManagedObjectContext проследява промените в екземплярите на типовете на вашето приложение.
  • Екземпляр на NSPersistentStoreCoordinator запазва и извлича екземпляри на типовете на вашето приложение от магазините.
  • Екземпляр на NSPersistentContainer настройва модела, контекста и координатора за съхранение наведнъж.

Различни типове данни в основните данни

Много приложения трябва да постоянстват и да представят различни видове информация. Основните данни предоставят различни атрибути, включително тези, общи за всички бази данни, като тип Date или Decimal, и нестандартни атрибути, обработвани с тип Transformable.

18. Какво е Sentinel Value?

Валидна стойност, която представлява специално състояние, като липса на стойност, е известна като контролна стойност. Това би бил вашият празен низ. 🙂

19. Автоматично броене на препратки (ARC)

Swift използва ARC, за да проследява и управлява използването на паметта на вашето приложение. ARC автоматично освобождава паметта, използвана от екземплярите на класа, когато тези екземпляри вече не са необходими, не е необходимо да мислите за управление на паметта.

Но в няколко случая ARC изисква повече информация за връзките между части от вашия код, за да управлява паметта вместо вас.

Преброяването на препратките се отнася само за екземпляри на класове. Структурите и изброяванията са типове стойности, а не референтни типове и не се съхраняват и предават по референция.

Ще ПУБЛИКУВАМ цяла статия по тази тема с повече подробности!

20. Какво е вложено по избор?

Помислете за следното вложено незадължително — то съответства на число в кутия в кутия в кутия.



21. Какво представляват наблюдателите на собствеността?

WillSet наблюдател се извиква, когато свойство е на път да бъде променено, докато didSet наблюдател се извиква, след като свойство е било променено. Техният синтаксис е подобен на гетерите и сетерите:

struct S {
    var stored: String {
        willSet {
            print("willSet was called")
            print("stored is now equal to \(self.stored)")
            print("stored will be set to \(newValue)")
        }
        didSet {
            print("didSet was called")
            print("stored is now equal to \(self.stored)")
            print("stored was previously set to \(oldValue)")
        }
    }
}var s = S(stored: "first")
s.stored = "second"
  • willSet беше извикан
  • съхранено сега е равно на първо
  • съхраненото ще бъде зададено на второ
  • didSet беше извикан
  • сега е равно на секунда
  • запаметено преди това беше зададено на първо

22. Кога бихте казали, че дадено приложение е в активно състояние?

Твърди се, че дадено приложение е в активно състояние, когато приема събития и работи на преден план.

23. Каква е разликата между Viewdidload и Viewdidappear?

  • Viewdidload се извиква, когато се зареди в паметта.
  • Viewdidappear се извиква, когато изгледът е видим и представен на устройството.

24. Какво имате предвид под паралелност?

Паралелността е състояние в програма, при което две или повече задачи са дефинирани независимо и всяка може да се изпълнява независимо от другата, дори ако другата също се изпълнява по същото време.

25. Кои са начините за постигане на едновременност в iOS?

Трите начина за постигане на едновременност в iOS са:

  • нишки
  • Опашки за изпращане
  • Операционни опашки

26. Какво е Thread?

Според Apple:

„Нишките са особено полезни, когато трябва да изпълните дълга задача, но не искате тя да блокира изпълнението на останалата част от приложението. По-специално, можете да използвате нишки, за да избегнете блокиране на основната нишка на приложението, което обработва потребителския интерфейс и действията, свързани със събития. Нишките могат да се използват и за разделяне на голяма работа на няколко по-малки, което може да доведе до повишаване на производителността на многоядрени компютри.“

27. Какво е опашка за изпращане в Basics?

Според Apple:

Обект, който управлява изпълнението на задачи последователно или едновременно в основната нишка на вашето приложение или във фонова нишка.

28. Разлика между преден и заден план?

Предният план съдържа приложенията, върху които работи потребителят, а фонът съдържа приложенията, които са зад кулисите.

29. Класове

Класовете са референтни типове, за разлика от стойностните типове. Създавате клас като:

class Person {
    var firstName: String
    var lastName: Stringinit(firstName: String, lastName: String) {
        self.firstName = firstName
        self.lastName = lastName
    }
 
    var fullName: String {
        return "\(firstName) \(lastName)"
    }
}let john = Person(firstName: "Johnny", lastName: "Appleseed")

В Swift екземпляр на структура е неизменна стойност, докато екземпляр на клас е променлив обект. Класовете са референтни типове, така че променлива от тип клас не съхранява действителен екземпляр — тя съхранява препратка към място в паметта, където се съхранява екземплярът.

Ето го Stack vs Heap!

Когато създавате референтен тип като клас, системата съхранява действителния екземпляр в област на паметта, известна като купчината, докато екземплярите на тип стойност като структура се намират в област на паметта, наречена стек.

  • Системата използва стека, за да съхранява всичко в непосредствената нишка на изпълнение; той се управлява и оптимизира строго от процесора. Когато функция създава променлива, стекът съхранява тази променлива и след това я унищожава, когато функцията излезе. Тъй като стекът е толкова строго организиран, той е много ефективен и следователно доста бърз.
  • Системата използва купчината, за да съхранява екземпляри на референтни типове. Купчината обикновено е голям набор от памет, от който системата може да изисква и динамично да разпределя блокове памет. Lifetime е гъвкав и динамичен. Купчината не унищожава автоматично своите данни, както прави стекът; е необходима допълнителна работа за това. Това прави създаването и премахването на данни в купчината по-бавен процес в сравнение със стека.

Работа с референция

var homeOwner = john 
john.firstName = "John" 
john.firstName // "John" 
homeOwner.firstName // "John"

Споделянето между екземпляри на клас води до нов начин на мислене при предаване на неща. Например, ако обектът john се промени, тогава всичко, което съдържа препратка към john, автоматично ще види актуализацията. Ако сте използвали структура, ще трябва да актуализирате всяко копие поотделно или то все още ще има старата стойност на „Джони“.

Оператори за идентичност

Тъй като класовете са референтни типове, възможно е множество константи и променливи да препращат към един и същ екземпляр на клас зад кулисите.

В Swift операторът === ви позволява да проверите дали идентичността на един обект е равна на идентичността на друг:

john === homeOwner // truelet newInstance = Person(firstName: "Johnny",  lastName: "Appleseed")newInstance === John // false

30. Какво е MVC?

MVC означава контролер за изглед на модел. Моделите представляват данни от приложението; изгледи рисуват неща на екрана; контролерите управляват потока от данни между модела и изгледа. Моделът и изгледът никога не комуникират помежду си директно и разчитат на контролер за координиране на комуникацията.

31. Какво е @State?

Ако присвоите @State на свойство, SwiftUI ще наблюдава това свойство и, ако е мутирало или променено, ще обезсили текущото оформление и ще презареди.

Няма нужда да извиквате извикване за опресняване (или reloadData(), както може би сте виждали преди в CollectionViews и TableViews).

32. Какво представляват модификаторите?

Това са начин за изобразяване на персонализирани взаимодействия и декорация. font(), background() и clipShape()са някои примери.

33. Какво е вложен синтаксис?

Прост пример за това е вмъкването на списък в навигационен изглед.

34. Какво е групиране в SwiftUI?

Да предположим, че сте написали следния код:

VStack {
    Text("Line")
    Text("Line")
    Text("Line")
    Text("Line")
    Text("Line")
    Text("Line")
    Text("Line")
    Text("Line")
    Text("Line")
    Text("Line")
}

Това работи добре, но ако се опитате да добавите единадесето парче текст, ще получите грешка като тази:

ambiguous reference to member 'buildBlock()'

Това е така, защото системата за изграждане на изгледи на SwiftUI има различен код, предназначен да ни позволи да добавяме 1 изглед, 2 изгледа или 4, 5, 6, 7, 8, 9 и 10 изгледа, но не и за 11 и повече, това не работи.

Но можем да направим това:

var body: some View {
    VStack {
        Group {
            Text("Line")
            Text("Line")
            Text("Line")
            Text("Line")
            Text("Line")
            Text("Line")
        }
        Group {
            Text("Line")
            Text("Line")
            Text("Line")
            Text("Line")
            Text("Line")
        }
    }
}

Това създава абсолютно същия резултат, само че сега можем да надхвърлим ограничението от 10 изгледа, тъй като VStack съдържа само два изгледа – двегрупи.

35. Какво е Combine?

Combine е собствената версия на Swift на Reactive Streams и позволява обектите да бъдат наблюдавани (наблюдавани) и данните да бъдат предавани през потоци от логиката на основното приложение обратно до UI слоя.

36. Какво използва речникът на HashFunction Swifts?

Swift използва хеш функцията SipHash за обработка на много от изчисленията на хеш стойността.

37. Какво е init() в Swift?

Инициализирането е процес на подготовка на екземпляр на изброяване, структура или клас за използване.

38. Какви са изразите за прехвърляне на контрол, които се използват в iOS swift?

  1. Връщане
  2. почивка
  3. продължи
  4. Пропадам

39. Какво е делегат в swift?

Делегатът е шаблон за проектиране, който се използва за предаване на данни или комуникация между структури или класове. Делегирането позволява изпращане на съобщение от един обект до друг обект, когато се случи конкретно събитие и се използва за обработка на събития за изглед на таблица и изглед на колекция.

40. Какво е незадължително свързване?

Верижното свързване по избор е полезен процес, който можем да използваме в комбинация с опцията за извикване на методите, свойствата и индексите на опциите и тези стойности могат или не могат да бъдат нула. В този процес може да се опитаме да извлечем стойност от верига от незадължителни стойности.

Накъде да отида от тук ?

Моят LinkedIn : linkedin.com/in/my-pro-file

Проверете това: https://bit.ly/38k4w7l

За да се свържете и да прочетете тези полезни статии, последвайте ме тук.

Благодаря ви!
Мохамад Ясир

Получете достъп до експертен изглед — Абонирайте се за DDI Intel