Swift 3.0, багато шуму, а що на ділі?



На початку травня на просторах інтернету розробники мови оголосили, що починають підготовку до релізу 3.0 версію мови. Розробка 3.0 йде в майстер гілці, за релізами, можна зрозуміти, що 3-го травня був реліз Swift 2.2.1. Потім майстер почали вливати зміни щодо 3-їй версії мови. 9-го травня вже з'явився перший developer реліз з того ж майстра, який можна вжити на останній xcode через інсталятор з swift.org/download/#snapshots, який включається через Preferences -> Components -> Toolchains.

Трохи загальної інформації про майбутнє релізі

Приблизно під час першого dev релізу Swift 3.0, розробники заявили, що, на жаль, не встигають реалізувати ABI сумісність у версії 3.0. Давайте розбиратися, що це взагалі значить, бо я сам перший раз ці три літери побачив разом.

ABI це application binary interface, грубо кажучи це сумісність бінарників різних версій між собою, можна привести аналогію зі звичним нам API сумісністю, коли API 1.0 сумісний з 2.0, але зміни, зроблені в 3.0, вже будуть несумісні з першою версією, тому при використання API 3.0 потрібно буде правити код (у випадку з ABI не правити код, а перезбирати бінарники).

Насправді, як виявилося для мене відкриттям, Swift ще ніколи не мав ABI компатибили. Це говорить про те, що ліба, зібраний на Swift 2.0 вже не буде резолвиться з 2.2 версією мови. Колеги з стабільних мов:



Ось так виявляється і живемо. Але светрам сфивтерам в цьому плані пощастило, бо депенденси менеджери (cocoapods, carthage) завжди підтягують исходники проектів, а не бінарники, тому проблем з ABI сумісністю як таких немає. Але, мабуть, поки що варто утриматися від написання пропрієтарних ліб на сфивте і викладати їх в паблік у вигляді бінарників. Так, ABI обіцяють додати до Swift 4.0.

Подивимося на зміни в API





Навіть метод didFinishLaunching підсвічується варнингом, так як у нього змінилася сигнатруа, зараз він став

/// swift 3
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]? = [:]) -> Bool {}

/// swift 2
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {}

Варнинги повинні бути легко пофикшены тулзой для міграції на Swift 3.0 в Xcode в майбутньому.

Подивимося на зміни в стандартній бібліотеці Swift і в Foundation

ErrorType поміняли на ErrorProtocol

/// swift 3
enum MyError: ErrorProtocol {
case Success
case Fail(ErrorProtocol)
}

/// swift 2
enum MyError: ErrorType {
case Success
case Fail(ErrorType)
}


Зміни для Array

/// swift 3
sort() // сортує сам себе
sorted() // сортує і повертає новий відсортований масив не змінюючи порядок в старому

/// swift 2
sortInPlace() // сортує сам себе
sort() // сортує і повертає новий відсортований масив не змінюючи порядок в старому


тобто метод sort став мутабельным, прибрали sortInPlace і додали sorted.

/// swift 3
reversed()
append(contentsOf: [T])
insert(T, at: Int)
joined(separator: String)

/// swift 2
reverse()
appendContentsOf([T])
insert(T, atIndex: Int)
joinWithSeparator(String)

Також прибрали багато конструктори і перейменували інші методи.

Зміни для String

/// swift 3
"3.0".components(separatedBy: ".")
"3.0".substring(to: 1)
"3.0".substring(from: 1)
"".data(using: NSUTF8StringEncoding)
"2.0".replacingOccurrences(of: "2", with: "3")
"".uppercased()
"".lowercased()
"3.0".contains(".")
"3.".appending("0")
("dir1" as NSString).appendingPathComponent("dir2")
" 3.0 ".trimmingCharacters(in: .whitespaces())
"".write(toFile: "/..", atomically: true, encoding: NSUTF8StringEncoding)

/// swift 2
"3.0".componentsSeparatedByString(".")
"3.0".substringToIndex(1)
"3.0".substringFromIndex(1)
"3.0".dataUsingEncoding(NSUTF8StringEncoding)
"2.0".stringByReplacingOccurrencesOfString("2", withString: "3")
"".uppercaseString
"".lowercaseString
"3.0".containsString(".")
"3.0".appendContentsOf(".release")
("dir1" as NSString).stringByAppendingPathComponent("dir2")
"3.0".stringByTrimmingCharactersInSet(.whitespaceCharacterSet())
"3.0".writeToFile("/..", atomically: true, encoding: NSUTF8StringEncoding)


Кейси для enum зараз у ловер кейсі

/// swift 3
UIInterfaceOrientation.portrait
Optional.some("")
Optional.none

/// swift 2
UIInterfaceOrientation.Portrait
Optional.Some("")
Optional.None


Зміни в UIKit

/// swift 3
let vc = UIViewController()
vc.present(some, animated: true, completion: nil)
vc.dismiss(animated: true, completion: nil)
vc.prepare(for: segue sender: button)

UIColor.white()
UIColor.blue()

let path = UIBezierPath()
path.move(to: CGPoint(x 0, y: 0))
path.addLine(to: CGPoint(x: 100, y: 100))

// додався знак _ на початку першого параметра + скоротили ім'я аргументу функції, з-за чого будуть варниги в проекті
func tableView(_ tableView: UITableView, numberOfSections section: Int) -> Int { return 0 }
func tableView(_ tableView: UITableView, cellForRowAt indexPath: NSIndexPath) -> UITableViewCell { return UITableViewCell() }
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: NSIndexPath) { }

/// swift 2
let vc = UIViewController()
vc.presentViewController(some, animated: true, completion: nil)
vc.dismissViewControllerAnimated(true, completion: nil)
vc.prepareForSegue(segue, sender: button)

UIColor.whiteColor()
UIColor.blueColor()

let path = UIBezierPath()
path.moveToPoint(CGPoint(x 0, y: 0))
path.addLineToPoint(CGPoint(x: 100, y: 100))

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 0 }
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { return UITableViewCell() }
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { }


зміни

/// swift 3
NSData(contentsOf: "")
UIApplication.shared()
NSUserDefaults.standard().set("value", forKey: "key")
NSFileManager.default().fileExists(atPath: "/...")
NSBundle.main()

/// swift 2
NSData(contentsOfURL: "/")
UIApplication.sharedApplication()
NSUserDefaults.standardUserDefaults().setObject("value", forKey: "key")
NSFileManager.defaultManager().fileExistsAtPath("/")
NSBundle.mainBundle()


Ось так провели swiftification, загалом постраждав весь апі, а не тільки стандартна бібліотека. Але варто зізнатися, читабельність дійсно стала краще. Реліз Swift 3.0 намічений на осінь. ABI compatibility запланована в 4.0. Чогось нового в Swift не варто очікувати на WWDC 2016.

Постає питання, так що ж все-таки вибрати на новий проект? Я голосую за Swift, з ним розробка йде набагато швидше і безпечніше зважаючи на дуже суворої типизаций і витребеньок вигляді Optional і синтаксису замикань/лямбд. Загалом:



Корисні посилання:

https://swift.org/blog/
https://www.hackingwithswift.com/swift3
https://github.com/apple/swift-evolution
http://www.bensnider.com/abi-compatibility-whoopdty-do-what-does-it-all-mean.html

update

Варто додати, що розробники Swift перелопатили весь API, щоб зробити його як і замислювалося з перших днів мови, просто підтримка сумісності з Objective-C зробила свою справу і поламала початковий API дизайн. Планується, що Swift буде працювати на багатьох платформах, включаючи FreeBSD, Raspberry Pi, Android, Windows. Мабуть, саме у версії 3.0 вирішили зробити повну переробку API, надати йому більш сфивтовый стиль.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.