Swift клас срещу Cocoa Touch Class в Xcode6

Аз съм нов в разработката на iOS и започнах директно със Swift.

Когато искам да добавя нов файл към проект, IDE ми представя два файла, които изглежда се използват взаимозаменяемо в уроците, които съм виждал досега. Те са "Cocoa Touch Class" и "Swift Class".

Когато създам нов Cocoa Touch Class, това е, което получавам (в зависимост от наследения клас)

import UIKit

class CtTest: NSObject {

}

и когато създам нов Swift файл, получавам това: -

import Foundation

Разширението и за двата класа е .swift

Ако добавя дефиницията на класа към Swift файла и го модифицирам, както следва: -

import UIKit
import Foundation

class SwTest:NSObject
{
}

има ли някаква разлика между двата файла.

Ако е така, кои класове са предпочитани в какви сценарии, напр. Преглед на контролери, модели и др.

Благодаря ти


person Rajeev Bhatia    schedule 30.07.2014    source източник
comment
Foundation е рамката, която дефинира NSObject, NSString, NSArray и т.н. всички основни класове на goal-C. UIKit, от друга страна, дефинира изгледи, контролери за изгледи, контроли (напр. UIButton) и т.н. Обикновено импортирате Foundation за моделни класове (данни) и UIKit за класове изглед/контролер (презентация, логика).   -  person Nicolas Miari    schedule 30.07.2014
comment
Допълнение: Фондацията е обща за iOS и OSX. UIKit е само за iOS.   -  person Nicolas Miari    schedule 30.07.2014
comment
Благодаря за отговора Никола. Има смисъл защо Cocoa Touch Class ще импортира Foundation, а класовете Swift ще импортират UIKit. След това трябва ли да предпочитам Swift класове за View Controllers и Cocoa Touch Classes за модели (въпреки че най-вероятно бих използвал Swift типове данни като String, Int, Dictionary и т.н. пред основните типове данни като NSNumber, NSString и NSDictionary, правейки Foundation доста излишен) .   -  person Rajeev Bhatia    schedule 30.07.2014
comment
Самият аз все още не съм използвал swift, но вижте отговора по-долу от @drewag; тя е много добре написана и пълна.   -  person Nicolas Miari    schedule 30.07.2014
comment
Да, наистина е така. Също така намерих класовете Cocoa Touch за по-полезни, когато имате нужда от някои методи, добавени по подразбиране (както споменах в коментара си към неговия отговор). Благодаря ви отново за приноса!   -  person Rajeev Bhatia    schedule 30.07.2014


Отговори (1)


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

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

Фондация

Foundation е основно стандартната библиотека за разработка на Apple, внедрена в Objective-C. Той включва типове данни като NSArray, NSString и NSDictionary. Swift обаче предоставя заместители за тези типове данни: масив, низ и речник. Трябва само да import Foundation във файлове, които се опитват да взаимодействат с Objective-C API. Въпреки това, тъй като всички съществуващи API са написани на Objective-C (тъй като Swift е толкова нов), ще трябва да импортирате Foundation в почти всички файлове, с изключение на основните обекти на домейна.

UIKit

UIKit всъщност включва Foundation. Ако импортирате UIKit, не е необходимо да импортирате и Foundation. UIKit е колекция от стандартни API, специфични за интерфейса на iOS. Той включва изгледи като UITableView и контролери като UIViewController. Ще трябва да импортирате това винаги, когато работите върху потребителския интерфейс на приложенията за iOS.

Cocoa Touch Class

Този шаблон е полезен за подкласове на класове от UIKit и потенциално Xcode да генерира файлове за създаване на интерфейси за вас. Ако не се нуждаете от нито едно от тези неща, трябва просто да използвате шаблона Swift Class. Нека вашият обект наследява от NSObject само ако наистина трябва (ако трябва да можете да използвате вашия Swift клас от Objective-C). Ако не наследите от NSObject, има допълнителни оптимизации, които компилаторът може да направи и избягва някои от по-бавните части на времето за изпълнение на Objective-C.

person drewag    schedule 30.07.2014
comment
Благодаря за невероятния отговор, drewag. Току-що се опитах да създам два примерни класа (един Swift и един Cocoa Touch), които ще трябва да наследят UITableViewController. Със сигурност трябваше да правя всички тежки повдигания за класа Swift, но класът Cocoa Touch добави всички необходими методи за мен. Благодаря отново! - person Rajeev Bhatia; 30.07.2014