Swift Школа 
Сергей Пронин, Александр Зимин 
Empatika
План 
• Swift - Перегрузка операторов 
• iOS8 - App Groups 
• iOS8 - Extensions 
• iOS8 - Handoff
Перегрузка операторов
2 + 3
<Модификатор> operator <операция> { 
<Свойства> 
}
Модификаторы операций 
infix 
Модификатор инфикс операции 
Выполняется для двух объектов 
Пример: a + b 
prefix 
Модификатор префиксов операции 
Выполняется для одного объекта 
Пример: !flag 
postfix 
Модификатор постфиксной операции 
Выполняется для одного объекта 
Пример: i++
Свойства операций 
Precedence (UInt8) 
Приоритет операции 
Чем больше, тем приоритетнее 
Числа от 0 до 255 
Базовое значение - 100 
Associativity 
Ассоциативность операции 
Может быть left, right, none 
Assignment 
Присвоение 
Используется для операций формата = 
Только для infix операций
Приоритет 
infix operator >+ { 
precedence 40 
} 
func >+ (left: Double, right: Double) -> Double { 
return left + right 
} 
infix operator >* { 
precedence 30 
} 
func >* (left: Double, right: Double) -> Double { 
return left * right 
} 
let value = 10 >+ 5 >* 2 // 30
Ассоциативность 
infix operator >- { 
associativity left 
} 
func >- (left: Double, right: Double) -> Double { 
return left - right 
} 
infix operator >/ { 
associativity left 
} 
func >/ (left: Double, right: Double) -> Double { 
return left / right 
} 
let nValue = 10 >- 4 >/ 2 // 3 
let anotherValue = 10 >/ 2 >- 4 // 1
infix operator **= { 
precedence 120 
assignment 
} 
func **= (inout left: Double, right: Double) -> Double { 
left = left * right 
return left 
} 
infix operator ** { 
associativity left 
} 
func ** (left: Double, right: Double) -> Double { 
return left * right 
} 
infix operator +++ { 
associativity left 
} 
func +++ (left: Double, right: Double) -> Double { 
return left + right 
} 
var x = 3 +++ 4 ** 5 
let y = x **= 2 ** 4 
y 
x
infix operator **= { 
precedence 120 
assignment 
} 
func **= (inout left: Double, right: Double) -> Double { 
left = left * right 
return left 
} 
infix operator ** { 
associativity left 
} 
func ** (left: Double, right: Double) -> Double { 
return left * right 
} 
infix operator +++ { 
associativity left 
} 
func +++ (left: Double, right: Double) -> Double { 
return left + right 
} 
var x = 3 +++ 4 ** 5 // 35.0 
let y = x **= 2 ** 4 
y // 280.0 
x // 70
Перегрузка операторов для классов
struct Vector2D { 
var x = 0.0, y = 0.0 
}
func + (left: Vector2D, right: Vector2D) -> Vector2D { 
return Vector2D(x: left.x + right.x, y: left.y + right.y) 
} 
let vectorSum1 = Vector2D(x: 1.0, y: 2.0) 
let vectorSum2 = Vector2D(x: 0.5, y: -1.0) 
let vectorSum3 = vectorSum1 + vectorSum2 // {x 1.5, t 1.0}
prefix func -(vector: Vector2D) -> Vector2D { 
return Vector2D(x: -vector.x, y: -vector.y) 
} 
prefix func +(vector: Vector2D) -> Double { 
return vector.x + vector.y 
} 
let minusVector = -vectorSum3 // {x -1.5, y -1.0} 
let result = +vectorSum3 // 2.5
func += (inout left: Vector2D, right: Vector2D) { 
left = left + right 
} 
var newVector = Vector2D(x: 1.0, y: 1.0) // {x 1.0, y 1.0} 
newVector += Vector2D(x: 1.0, y: 2.0) // {x 2.0, y 3.0} 
postfix func ++ (inout vector: Vector2D) -> Vector2D { 
vector += Vector2D(x: 1.0, y: 1.0) 
return vector 
} 
newVector++ // {x 3.0, y 4.0} 
let updatedNewVector = newVector++ // {x 4.0, y 5.0}
infix operator ^^ {} 
func ^^ (left: Double, right: Double) -> Double { 
return pow(left, right) 
} 
5 ^^ 2 // 25.0 
3 ^^ 5 // 243.0
Extensions
App 
extension 
Containing Host app 
app 
Request 
Response
App 
extension 
Host app 
Containing 
app 
Request 
Response 
Open URL 
Read/Write 
Shared 
resources 
Read/Write
Today Widget
import NotificationCenter 
class TodayViewController: UIViewController, NCWidgetProviding { 
override func viewDidLoad() { 
super.viewDidLoad() 
self.preferredContentSize = CGSizeMake(320, 100) 
} 
//MARK: - NCWidgetProviding 
func widgetPerformUpdateWithCompletionHandler(completionHandler: 
(NCUpdateResult -> Void)!) { 
// update widget and call handler: .Failed, .NoData, .NewData 
completionHandler(NCUpdateResult.NewData) 
} 
func widgetMarginInsetsForProposedMarginInsets( 
defaultMarginInsets: UIEdgeInsets) -> UIEdgeInsets { 
return UIEdgeInsetsMake(8, 16, 8, 16) 
} 
}
App Groups
Handoff 
Continuity
func broadcastActivity() { 
var activity = NSUserActivity(activityType: "com.empatika.activity1") 
activity.addUserInfoEntriesFromDictionary([ 
"flight_id": self.currentFlight.flightId 
]) 
activity.title = self.currentFlight.name 
activity.delegate = self 
activity.setNeedsSave(true) 
activity.becomeCurrent() 
} 
// implement NSUserActivityDelegate 
func userActivityWillSave(activity: NSUserActivity) { 
activity.addUserInfoEntriesFromDictionary([ 
"flight_id": self.currentFlight.flightId 
]) 
} 
func userActivityWasContinued(activity: NSUserActivity) { 
//another device picker up the activity! 
}
// AppDelegate 
func application(application: UIApplication, 
continueUserActivity userActivity: NSUserActivity, 
restorationHandler: [AnyObject] -> Void) -> Bool { 
var flightIdOpt = userActivity.userInfo[“flight_id"] 
as? String 
if let flightId = flightIdOpt { 
//load flight locally or remotely and show 
} 
//optional. if restoration is set up 
restorationHandler(self.viewControllers) 
return true //or false if can’t 
}
Вопросы 
swift@empatika.com 
Дипломы

Swift School #4

  • 1.
    Swift Школа СергейПронин, Александр Зимин Empatika
  • 2.
    План • Swift- Перегрузка операторов • iOS8 - App Groups • iOS8 - Extensions • iOS8 - Handoff
  • 3.
  • 4.
  • 5.
  • 6.
    Модификаторы операций infix Модификатор инфикс операции Выполняется для двух объектов Пример: a + b prefix Модификатор префиксов операции Выполняется для одного объекта Пример: !flag postfix Модификатор постфиксной операции Выполняется для одного объекта Пример: i++
  • 7.
    Свойства операций Precedence(UInt8) Приоритет операции Чем больше, тем приоритетнее Числа от 0 до 255 Базовое значение - 100 Associativity Ассоциативность операции Может быть left, right, none Assignment Присвоение Используется для операций формата = Только для infix операций
  • 8.
    Приоритет infix operator>+ { precedence 40 } func >+ (left: Double, right: Double) -> Double { return left + right } infix operator >* { precedence 30 } func >* (left: Double, right: Double) -> Double { return left * right } let value = 10 >+ 5 >* 2 // 30
  • 9.
    Ассоциативность infix operator>- { associativity left } func >- (left: Double, right: Double) -> Double { return left - right } infix operator >/ { associativity left } func >/ (left: Double, right: Double) -> Double { return left / right } let nValue = 10 >- 4 >/ 2 // 3 let anotherValue = 10 >/ 2 >- 4 // 1
  • 10.
    infix operator **={ precedence 120 assignment } func **= (inout left: Double, right: Double) -> Double { left = left * right return left } infix operator ** { associativity left } func ** (left: Double, right: Double) -> Double { return left * right } infix operator +++ { associativity left } func +++ (left: Double, right: Double) -> Double { return left + right } var x = 3 +++ 4 ** 5 let y = x **= 2 ** 4 y x
  • 11.
    infix operator **={ precedence 120 assignment } func **= (inout left: Double, right: Double) -> Double { left = left * right return left } infix operator ** { associativity left } func ** (left: Double, right: Double) -> Double { return left * right } infix operator +++ { associativity left } func +++ (left: Double, right: Double) -> Double { return left + right } var x = 3 +++ 4 ** 5 // 35.0 let y = x **= 2 ** 4 y // 280.0 x // 70
  • 12.
  • 13.
    struct Vector2D { var x = 0.0, y = 0.0 }
  • 14.
    func + (left:Vector2D, right: Vector2D) -> Vector2D { return Vector2D(x: left.x + right.x, y: left.y + right.y) } let vectorSum1 = Vector2D(x: 1.0, y: 2.0) let vectorSum2 = Vector2D(x: 0.5, y: -1.0) let vectorSum3 = vectorSum1 + vectorSum2 // {x 1.5, t 1.0}
  • 15.
    prefix func -(vector:Vector2D) -> Vector2D { return Vector2D(x: -vector.x, y: -vector.y) } prefix func +(vector: Vector2D) -> Double { return vector.x + vector.y } let minusVector = -vectorSum3 // {x -1.5, y -1.0} let result = +vectorSum3 // 2.5
  • 16.
    func += (inoutleft: Vector2D, right: Vector2D) { left = left + right } var newVector = Vector2D(x: 1.0, y: 1.0) // {x 1.0, y 1.0} newVector += Vector2D(x: 1.0, y: 2.0) // {x 2.0, y 3.0} postfix func ++ (inout vector: Vector2D) -> Vector2D { vector += Vector2D(x: 1.0, y: 1.0) return vector } newVector++ // {x 3.0, y 4.0} let updatedNewVector = newVector++ // {x 4.0, y 5.0}
  • 17.
    infix operator ^^{} func ^^ (left: Double, right: Double) -> Double { return pow(left, right) } 5 ^^ 2 // 25.0 3 ^^ 5 // 243.0
  • 18.
  • 20.
    App extension ContainingHost app app Request Response
  • 21.
    App extension Hostapp Containing app Request Response Open URL Read/Write Shared resources Read/Write
  • 22.
  • 24.
    import NotificationCenter classTodayViewController: UIViewController, NCWidgetProviding { override func viewDidLoad() { super.viewDidLoad() self.preferredContentSize = CGSizeMake(320, 100) } //MARK: - NCWidgetProviding func widgetPerformUpdateWithCompletionHandler(completionHandler: (NCUpdateResult -> Void)!) { // update widget and call handler: .Failed, .NoData, .NewData completionHandler(NCUpdateResult.NewData) } func widgetMarginInsetsForProposedMarginInsets( defaultMarginInsets: UIEdgeInsets) -> UIEdgeInsets { return UIEdgeInsetsMake(8, 16, 8, 16) } }
  • 25.
  • 28.
  • 31.
    func broadcastActivity() { var activity = NSUserActivity(activityType: "com.empatika.activity1") activity.addUserInfoEntriesFromDictionary([ "flight_id": self.currentFlight.flightId ]) activity.title = self.currentFlight.name activity.delegate = self activity.setNeedsSave(true) activity.becomeCurrent() } // implement NSUserActivityDelegate func userActivityWillSave(activity: NSUserActivity) { activity.addUserInfoEntriesFromDictionary([ "flight_id": self.currentFlight.flightId ]) } func userActivityWasContinued(activity: NSUserActivity) { //another device picker up the activity! }
  • 32.
    // AppDelegate funcapplication(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: [AnyObject] -> Void) -> Bool { var flightIdOpt = userActivity.userInfo[“flight_id"] as? String if let flightId = flightIdOpt { //load flight locally or remotely and show } //optional. if restoration is set up restorationHandler(self.viewControllers) return true //or false if can’t }
  • 33.