iOS 9, XCode 7 et Swift 2 : quels impacts pour les développeurs ?

Publié le Mis à jour le Par ,

En juin dernier se déroulait l’Apple Worldwide Developers Conference (WWDC). Apple y dévoilait iOS 9 entres autres nouveautés. Le 9 septembre eu lieu le traditionnel keynote et la présentation des iPhone 6s, 6s+ et iPad Pro.

Voyons ensemble les changements introduits avec iOS 9 et XCode 7. Cet article est fortement orienté développeur et contient des extraits de code (Swift ou Objective-C).

Les nouveautés pour l’utilisateur

3DTouch

Les iPhone 6s et 6s+ ajoutent une nouvelle interaction : le 3D Touch. L’écran du terminal embarque une technologie permettant d’analyser la pression appliquée par un doigt.

Suite au keynote, Apple a mis à disposition des développeurs plusieurs exemples de code. Les exemples ne fonctionnent que pour les iPhones 6s et 6s+ avec iOS 9.1.

Voici les éléments clés à retenir:

  • pour savoir si votre terminal peut utiliser 3D Touch, il suffit d’utiliser la propriété suivante de la classe UITraitCollection
var forceTouchCapability: [UIForceTouchCapability]
  • la gestion de la pression se fait via la propriété suivante de la classe UITouch.
var force: CGFloat { get } 

Voir le tutoriel officiel.

  • le Peek and Pop donne un aperçu lors d’une pression longue. Très proche de l’aperçu rapide sur Mac OS X, cette action permet de visualiser un contenu sans avoir à l’ouvrir. Voir le tutoriel officiel.
  • il est possible de configurer un menu rapide (ou Application shortcuts) accessible lors d’un clic sur l’icône de votre application depuis le dashboard. Elle peut donc être lancée dans plusieurs configurations. Voir le tutoriel officiel.

Apple Pencil

Avec l’iPad Pro, Apple a annoncé son stylet : l’Apple Pencil. Un exemple d’utilisation en Swift est disponible ici. L’exemple est valable pour l’iPad Pro uniquement avec une version en iOS 9.1.

Les informations d’angle et de pression sont disponibles directement dans la classe UITouch. Les modifications du framework UIKit sont disponibles en ligne.

Pour savoir si un UITouch provient d’un stylet, on récupère son UITouchType.

enum UITouchType : Int {
    case Direct
    case Indirect
    case Stylus
}

La pression appliquée sur le stylet et la pression maximale sont accessibles via les propriétés

var force: CGFloat { get }
var maximumPossibleForce: CGFloat { get }

L’angle en radians entre le stylet et la tablette peut être obtenu avec la propriété « altitudeAngle ». 0, le stylet est parallèle, π / 2, il est perpendiculaire.

var altitudeAngle: CGFloat { get }

L’azimut en radians entre le stylet et une vue (ou la Window) peut être obtenu avec un appel à

func azimuthAngleInView(_ view: UIView?) -> CGFloat

iOS Search : un panneau de recherche amélioré

Il est désormais possible d’indexer des informations sur votre application pour que les utilisateurs les retrouvent lors d’une recherche avec Spotlight.

Ces informations peuvent être diverses : numéro de téléphone, itinéraire routier, page de contenu de l’application, produit d’un catalogue.

L’ordre d’apparence est calculé en fonction des actions de l’utilisateur, plus l’élément est choisi sur un terminal, plus haut il apparaîtra durant les recherches suivantes.

Côté développement natif, cela se fait par le biais de l’objet NSUserActivity, disponible depuis iOS 8 et originellement créé pour la reprise d’activité.

La propriété

@NSCopying var contentAttributeSet: [CSSearchableItemAttributeSet]

a été ajoutée pour personnaliser la ligne qui sera présentée dans les résultats de la recherche. On peut ainsi définir l’image, la description, etc.

Côté développement Web, cela se fait par l’intermédiaire du Applebot. C’est un programme (ou robot) qui tourne en arrière-plan sur les terminaux. Il va parcourir les pages web lorsque l’utilisateur les ouvre pour en extraire les éléments à indexer.

Un utilitaire en ligne pour analyser votre page est disponible ici.

Pour aller plus loin voici quelques liens de la documentation officielle : 1, 2, 3

Apple News Format

Avec iOS 9, News va devenir l’application officielle pour consulter des articles. Pour permettre aux diffuseurs de contenus de mettre à disposition leurs flux, Apple News Format a été créé. Les spécifications ne sont pas encore disponibles mais on a déjà plusieurs informations.
Il sera possible de choisir la disposition des éléments, la typographie, d’ajouter des médias photos / vidéos et des animations. Le contenu sera optimisé pour l’affichage sur les différents périphériques existants.
Enfin, on pourra connecter News à un système d’information ou un CMS, puis consulter des statistiques sur l’audience.

Retour à l’application parente

Un bouton back fait désormais son apparition dans la StatusBar. Il permet en un tap de revenir à l’application parente. L’affichage de ce bouton semble être complètement contrôlé par le système et aucune nouvelle API n’est prévue pour y accéder.

Apple souhaite ainsi fluidifier la navigation app / web / app. Pour autant, le passage de données entre applications n’a pas été simplifié et reste bien cloisonné avec l’utilisation de Custom Schemes ou des Apps Groups. A contraster avec Android où le mécanisme d’Intent permet un peu plus facilement de partager l’information.

Les développeurs d’AdBlock indiquent pour l’instant que ce système n’est pas assez puissant pour développer un bloqueur de publicité digne de ce nom.

Le multitâche sur iPad

Trois nouveaux systèmes d’utilisation pour le multitâche ont été ajoutés avec iOS 9. Attention, ils sont uniquement disponibles sur les derniers iPad : Mini 2 et 3, Air 1 et 2, et très sûrement pour l’iPad Pro.

Pendant sa conférence, Apple a mis l’accent sur le débogage et l’empreinte mémoire des applications. Ce n’est pas étonnant car l’arrivée de telles fonctionnalités va mettre en évidence les applications déjà existantes qui sont trop gourmandes, non optimisées ou comportant des fuites mémoire.

Slide Over

Le Slide Over permet de faire apparaître un panneau latéral, recouvrant l’application principale et offrant la possibilité de lancer une application.

À l’ouverture du panneau, l’application principale reçoit un message [UIApplicationDelegate applicationWillResignActive], lui permettant de sauvegarder des données utilisateur en cours. C’est une capture d’écran de l’application qui sera alors affichée.

Pour interdire le Slide Over, le paramètre UIRequiresFullScreen peut être renseigné dans Info.plist à la valeur YES.

L’application secondaire doit répondre à quelques règles :

  • Le base SDK de développement doit être iOS 9 (Latest iOS).
  • L’application doit supporter les quatre orientations.
  • Le premier écran doit être « LaunchScreen.storyboard ».

Side by Side

Disponible seulement pour l’iPad Air 2 et probablement l’iPad Pro, le side by side permet d’afficher deux applications côte à côte en ½ -½ ou ⅔ – ⅓.

Seules les applications répondant au critère du side over peuvent être utilisées en side by side.

Visuellement, lors d’un side over sur iPad Air 2, la barre centrale présente un bouton et lorsque l’utilisateur le touche les applications passent en side by side.

L’application principale, précédemment recouverte, est ré-ouverte avec le message : [UIApplicationDelegate applicationDidBecomeActive]. Chaque redimensionnement de la fenêtre provoque un appel consécutif des messages ResignActive et BecomeActive.

Picture in Picture

Cette nouvelle fonctionnalité nommée Picture in Picture (PiP) permet d’afficher, au dessus des autres applications, une fenêtre volante dans laquelle se joue une vidéo.

Pour lancer une vidéo en PiP depuis une application les conditions suivantes doivent être remplies :

  • le base SDK de développement doit être iOS 9 (Latest iOS).
  • l’application doit avoir la valeur Audio, AirPlay, and Picture in Picture pour le paramètre Required background modes.
  • la session audio doit être configurée avec la catégorie : AVAudioSessionCategoryPlayback

Pour une utilisation avec le AVKit :

Pour une utilisation avec le WebKit : il faut utiliser un WKWebView (disponible depuis iOS 8) qui gère le mode PiP.
Attention : le mode PiP doit être volontairement activé et désactivé par l’utilisateur. Si cela n’est pas le cas, l’application risque un refus lors de la soumission.

Plus de documentation ici.

Les nouveautés pour le développeur

Compte développeur

Il n’est plus nécessaire de dépenser 99$ pour activer son compte et développer son application. La publication, en revanche, nécessite toujours un compte développeur activé.

App Thinning

Apple vous propose de réaliser une cure d’amaigrissement pour vos apps. Nommé App Thinning le procédé se fait en 3 étapes :

Slicing

Le slicing consiste à créer et mettre à disposition des applications spécifiques à chaque plateforme. Pendant le développement avec XCode et le déploiement avec iTunes Connect, plusieurs variantes optimisées pour chaque iPhone et iPad sont automatiquement générées.

Il est obligatoire d’utiliser les Assets Catalogs pour bénéficier du slicing d’images. Il faut également utiliser la dernière version d’iTunes et télécharger son application depuis un terminal sous iOS 9.

Bitcode

Le bitcode est une représentation intermédiaire d’un programme, avant sa compilation définitive.

La représentation en bitcode est activée par défaut en iOS et obligatoire pour watchOS.

En soumettant une application iOS ou watchOS contenant du bitcode, iTunes Connect se charge automatiquement de la compiler et l’optimiser.

On-demand resources

Avec les ressources à la demande, Apple rattrape son retard par rapport à Android et ses Expansion Files.

Le principe est simple : des ressources (images, sons, données binaires, etc.) sont marquées depuis XCode comme étant « à la demande » et associées à un tag. Elles sont stockées sur un serveur d’Apple (ou le vôtre) et non embarquées dans l’application, réduisant le poids de cette dernière.

Avant d’utiliser une ressource, l’application doit demander au système de télécharger le ou les tags correspondants. Le système notifie ensuite l’application que la ressource est disponible. Lorsque la ressource n’est plus utilisée, elle est libérée automatiquement pour gagner de l’espace disque.

Tout ceci est géré de façon transparente pour l’utilisateur. Le développeur devra prendre soin d’afficher un indicateur d’activité lorsque le chargement s’avère conséquent.

Les applications sont diverses : téléchargement de niveaux de jeux vidéos, d’un catalogue de produits, d’images, de vidéos de tutoriel, etc.

La classe qui s’occupe de charger les ressources est NSBundleResourceRequest. Voici un peu de code pour illustrer tout ceci :

NSSet *tags = [NSSet setWithArray: @[@"tutorial", @"credits"]];
resourceRequest = [[NSBundleResourceRequest alloc] initWithTags:tags];
resourceRequest.loadingPriority = NSBundleResourceRequestLoadingPriorityUrgent;

[resourceRequest beginAccessingResourcesWithCompletionHandler:
^(NSError * __nullable error)
{
**if** (error) { **return**;
}
//Resource is here, open it !
}
];

Dans les grandes lignes, il est possible :

  • d’embarquer des ressources au premier téléchargement de l’application
  • de consulter l’état des ressources pendant un débogage
  • de télécharger les ressources associées à une liste de tags
  • de modifier la priorité d’un téléchargement
  • d’être notifié de l’avancée d’un téléchargement
  • d’être notifié en cas d’espace disque faible
  • de mettre en pause, reprendre ou annuler un téléchargement
  • de notifier le système lorsqu’une ressource n’est plus utilisée
  • d’indiquer une priorité pour que le système choisisse intelligemment quelles ressources désallouer
  • d’héberger les ressources sur votre propre serveur

Toutes les informations sont disponibles ici.

UIStackView

Après le NSCollectionView, c’est le NSStackView de OS X v10.9 qu’Apple intègre à ses applications mobiles.

Ce composant, similaire au Vertical/Horizontal layout d’Android, permet de placer des éléments à la suite les uns des autres sans ajouter de contraintes entre eux.

Il est dynamiquement paramétrable :
* orientation
* distribution
* alignement
* espacement par défaut : pour un espacement différent, il faut utiliser les contraintes.

class ViewController: UIViewController {
    @IBOutlet weak var horizontalStackView: UIStackView!

    @IBAction func addElement(sender: AnyObject) {
        let imgVw:UIImageView = UIImageView(image: UIImage(named: "img"))
        imgVw.contentMode = .ScaleAspectFit
        self.horizontalStackView.addArrangedSubview(imgVw)
        UIView.animateWithDuration(0.25, animations: {
            self.horizontalStackView.layoutIfNeeded()
        })
    }

    @IBAction func removeElement(sender: AnyObject) {
        if let imgVw:UIView? = self.horizontalStackView.arrangedSubviews.last {
            self.horizontalStackView.removeArrangedSubview(imgVw)
            imgVw.removeFromSuperview()
            UIView.animateWithDuration(0.25, animations: {
                self.horizontalStackView.layoutIfNeeded()
            })
        }
    }
}

Voir la documentation de référence.

MapKit

Personnalisation

La coloration du POI n’est plus limitée au seul rouge, vert, mauve. C’est maintenant une propriété [MKPinAnnotationView pinTintColor] de type UIColor. L’ancien message [MKPinAnnotationView pinColor] est déprécié.

Le callout -fenêtre apparaissant au clic sur un POI- possède une nouvelle propriété [MKAnnotationView detailCalloutAccessoryView] permettant d’afficher directement une UIView, plus simple d’utilisation que les quatre composants actuels : title, subtitle, rightCalloutAccessoryView et leftCalloutAccessoryView.

Trois nouvelles propriétés de MKMapView : showsTraffic, showsScale et showsCompass ont été ajoutées. Elles permettent d’afficher de nouvelles données directement sur les cartes intégrées aux applications, respectivement : le trafic routier, l’échelle, et la boussole.

Transit

Un nouveau type de transport a été ajouté : « transit » qui correspond aux transports en commun.

struct MKDirectionsTransportType: OptionSetType {
   init(rawValue rawValue:UInt)
   static var Automobile: MKDirectionsTransportType { get }
   static var Walking: MKDirectionsTransportType { get }
   static var Transit: MKDirectionsTransportType { get }
   static var Any: MKDirectionsTransportType { get }
}

Le message [MKDirections calculateETAWithCompletionHandler:] permet de calculer le temps d’un trajet y compris avec le type Transit :

let request = MKDirectionRequest()
request.source = source
request.destination = destination
request.transportType = MKDirectionsTransportType.Transit
let directions = MKDirections(request: request)
directions.calculateETAWithCompletionHandler { response, error in
        if error == nil {
            if let r = response {
                print(r.expectedTravelTime)
            }
        }
    }
}

Il est aussi possible d’ouvrir l’application Plan avec un trajet, le code suivant affichera dans l’application Plan le trajet via les transports en commun entre la position de l’utilisateur et le point placemark :

var placemark = MKPlacemark(coordinate:coord, addressDictionary: nil)
var mapItem = MKMapItem(placemark: placemark)
let launchOptions = [MKLaunchOptionsDirectionsModeKey:MKLaunchOptionsDirectionsModeTransit]
mapItem.openInMapsWithLaunchOptions(launchOptions)

Flyover

L’une des grandes nouveautés apportées avec l’arrivée de Plan dans iOS 6 était la fonctionnalité Flyover permettant de voir certains lieux en 3D. Avec iOS 9 cette fonctionnalité est disponible directement depuis une application cliente.

MKMapType possède deux nouvelles valeurs : SatelliteFlyover et HybridFlyover ce dernier permet d’afficher en plus les routes et noms de lieux.

Dans ces modes, la carte est représentée sous forme de globe, il y a donc des points à prendre en compte :

  • Limite de taille : la terre étant sphérique il n’est pas possible d’afficher la totalité de la carte du monde.
  • Distorsion : pour voir les façades des bâtiments la caméra doit être inclinée. La zone visible n’est plus un rectangle mais un trapézoïde. Cependant, les régions définies avec MKCoordinateRegion et MKMapRect sont des rectangles qui englobent la région visible.

La gestion de la vue se fait par l’intermédiaire de l’objet MKMapCamera, elle peut être configurée (voir les paramètres suivants) et animée :

var centerCoordinate: CLLocationCoordinate2D
var heading: CLLocationDirection
var pitch: CGFloat
var altitude: CLLocationDistance

Plus d’informations ici et .

Core Location

Des améliorations ont été apportées à la gestion des mises à jour de la position de l’utilisateur lorsque l’application passe en arrière plan.

Pour éviter les erreurs, en plus d’indiquer que la localisation sera utilisée en arrière plan dans les paramètres du projet, il faut aussi l’indiquer dans l’instance de l’objet CLLocationManager via le booléen : [CLLocationManager allowsBackgroundLocationUpdates].

Depuis iOS 8, lorsque l’application est en arrière plan, elle apparaît dans une barre bleue (au niveau de la status bar) pour indiquer que l’application utilise le GPS.

Les autorisations liées à la localisation ont été modifiées. Il y a maintenant deux méthodes :

-requestWhenInUseAuthorization Pour un usage en premier plan ou dans la barre bleue.
-requestAlwaysAuthorization Pour un usage en toutes situations.

Plus d’informations ici.

Support du right to left

Apple ajoute une aide pour la gestion de l’internationalisation.

Une nouvelle propriété d’UIView, semanticContentAttribute, retourne une constante de type UISemanticContentAttribute :

enum UISemanticContentAttribute :Int {
case Unspecified
case Playback
case Spatial
case ForceLeftToRight
case ForceRightToLeft
}

Elle s’utilise avec la méthode de classe userInterfaceLayoutDirectionForSemanticContentAttribute qui permet de détecter un changement de sens de lecture, et d’effectuer les retournements manquants.

if UIView.userInterfaceLayoutDirectionForSemanticContentAttribute( self.view.semanticContentAttribute ) == .RightToLeft
{
// DO MISSING FLIP
}

La classe UIImageView a elle aussi une nouvelle méthode imageFlippedForRightToLeftLayoutDirection. Elle retourne une image inversée verticalement.

La documentation complète.

Framework Contacts et ContactsUI

Les framework AddressBook et AddressBookUI sont remplacés par Contacts et ContactsUI. Selon Apple ils fournissent des objets plus modernes.

SFSafariViewController pour afficher du contenu Web

Une nouvelle classe SFSafariViewController est fournie par le framework SafariServices.

C’est une fenêtre modale affichant une webview qui a entre autres particularités l’avantage de partager les cookies du navigateur Safari du téléphone.

Apple recommande son usage pour l’affichage de contenu web non retouché ou généré par l’application.

UIUserNotificationAction

La version 8 d’iOS apportait la possibilité de définir des boutons d’action au sein même des notifications push reçues. Ces actions sont ensuite gérées dans l’application par des objets de type UIUserNotificationAction.

iOS 9 introduit la possibilité de renseigner, en plus du bouton d’action, un champ de texte au sein de la notification.

Une propriété behavior a été ajoutée à UIUserNotificationAction afin de gérer ce cas.

CloudKitJS

Apple fournit désormais un framework JavaScript utilisable depuis une page web.

<script src="https://cdn.apple-cloudkit.com/ck/1/cloudkit.js">

Il est alors possible d’accéder aux données de votre application qui sont stockées dans un conteneur CloudKit.

Plus d’informations ici.

HealthKit

Nouveaux DataTypes

Plusieurs nouveaux types et catégories ont été rajoutés avec iOS9. Les plus attendus sont ceux qui concernent le suivi de la fécondité et de la grossesse.

HKQuantityTypeIdentifierBasalBodyTemperature
HKCategoryTypeIdentifierCervicalMucusQuality
HKCategoryTypeIdentifierOvulationTestResult
HKCategoryTypeIdentifierMenstrualFlow
HKCategoryTypeIdentifierVaginalSpotting
HKCategoryTypeIdentifierSexualActivity
HKQuantityTypeIdentifierDietaryWater
HKQuantityTypeIdentifierUVExposure
HKCharacteristicTypeIdentifierFtizpatrickSkinType

Changement de la classe HKObject

Quelques changements dans les propriétés de l’objet HKObject qui stocke les données manipulées par HealthKit.

sourceRevision : HKSourceRevision remplace source : HKSource. En plus de stocker l’application ayant partagé la donnée « source », elle contient également un identifiant de révision nommé version. Cet identifiant vaudra nil pour toutes les applications ayant partagé des données avant iOS 9.

device : HKDevice permet de savoir quel appareil a été utilisé pour générer la donnée.

Ces informations sont utiles dans un contexte médical où la provenance et la fiabilité des données sont cruciales.

Suppression et synchronisation des données

Avec l’ajout des méthodes deleteObjects, deleteObjectsOfType et de la classe HKAnchoredObjectQuery, la synchronisation entre les applications et HealthKit est largement facilitée. Votre application peut désormais être notifiée des changements ou suppressions de données.

HomeKit

Général

Des notifications précises sont émises lorsqu’un élément change de pièce

home:didUpdateRoom:forAccessory:

Les pièces HMRoom sont désormais uniques grâce à un UUID : uniqueIdentifier
Les trois méthodes et propriétés suivantes sont désormais dépréciées

addUserWithCompletionHandler:
removeUser:completionHandler:
users

et remplacées par HMHome manageUsersWithCompletionHandler: qui fait apparaître un ViewController géré par le système pour ajouter / modifier / supprimer les personnes dans leurs pièces.

Il est désormais possible de connaître l’utilisateur courant authentifié du foyer et de savoir s’il est administrateur ou non.

HMHome.currentUser
[HMHome homeAccessControlForUser:]
HMHomeAccessControl.administrator

Des scènes prédéfinies peuvent être suggérées à l’utilisateur. Elles ne pourront pas être supprimées du foyer.

  • Lever : HMActionSetTypeWakeUp
  • Départ du foyer : HMActionSetTypeHomeDeparture
  • Retour au foyer : HMActionSetTypeHomeArrival
  • Coucher : HMActionSetTypeSleep

Accessoires

Les différents accessoires peuvent être classés dans des catégories standards. Par exemple HMAccessoryCategoryTypeDoor pour une porte ou HMAccessoryCategoryTypeFan pour un ventilateur.

Avec iOS 8 il était possible de contrôler les accessoires à distance en passant par une AppleTV.
Avec iOS 9, un nouveau protocole HAP (HomeKit Access protocol) fait son apparition. Et c’est alors en passant par un service dédié iCloud que l’accès à distance se fait.

Les accessoires peuvent désormais envoyer des notifications et des métadonnées aux terminaux iOS.

Déclencheurs

Le changement d’état d’un accessoire peut générer un évènement.

Sous certaines conditions (temps, état d’un autre accessoire, position du soleil), ces évènements déclenchent des scènes.

En termes d’objets, les évènements sont des HMCharacteristicEvent, les conditions des NSPredicate. Enfin, le déclencheur qui associe évènements et conditions est un HMEventTrigger.

Jeux

GameplayKit

Nous ne rentrerons pas dans le détail pour cette section. Sachez toutefois qu’un nouveau framework GameplayKit fait son apparition. Il est différent et séparé de SceneKit, SpriteKit et Metal, mais s’interface bien avec ces derniers.

Il fournit :

  • design patterns et architectures pour le jeu
  • des algorithmes de gameplay standards

Model I/O

Model I/O est un nouveau framework qui permet d’importer, de modifier et d’exporter des objets 3D depuis différents formats de fichier. Les extensions .abc, .ply, .stl et .obj sont supportées pour l’import, alors que .stl et .obj sont supportées pour l’export.
Il gère également illumination, caméras et matériaux. Il est utilisable via un framework mais peut l’être directement depuis Xcode

Plus d’informations ici.

Les nouveautés dans l’éditeur (XCode 7)

App Transport Policy

Avec iOS 9, Apple renforce la politique de sécurité pour les connexions réseau. Lorsqu’ATS est activé, l’application est obligée de respecter certaines règles. Si ce n’est pas le cas, elle doit l’indiquer dans son Info.plist.

NSURLConnection est déprécié.

L’erreur « The resource could not be loaded because the App Transport Security policy requires the use of a secure connection. » se produit si la configuration du Transport Security n’a pas été effectuée. Voir l’exemple.

Simulateur et Apple Watch

La brique de développement pour les applications Apple Watch a été ajoutée.

Il est désormais possible de simuler les interactions entre deux appareils (simulateur watch + simulateur iDevice).

Cette nouveauté est disponible seulement pour une application avec iOS 9 au minimum.

XCode 7.1 et Apple TV

Dans la future mise à jour de XCode il sera possible de programmer des applications pour Apple TV.

l’IDE intégrera aussi iOS 9.1 et les fonctionnalités liées à l’iPad Pro/l’Apple Pencil et iPhone 6s, 6s plus / 3D Touch.

Blocage de contenu pour Safari

Avec XCode7, il est maintenant possible de créer des extensions de type Content Blocker pour Safari.

Une nouvelle target et quelques lignes de configuration dans un fichier JSON suffisent pour créer une règle simple de masquage ou blocage.

Swift 2

Swift 2 a été annoncé en juin. Apple a décidé de rendre le langage open-source durant l’année.

Au lancement, la société contribuera au portage sur iOS, OSX et Linux et le code contiendra les sources du compilateur et de la bibliothèque standard.

A la manière de .NET, nous verrons sûrement Swift émerger sur différents systèmes.

Gestion d’erreur

La gestion d’erreur a été modifiée pour intégrer les try/catch.
Une méthode peut générer (i.e. throw) des erreurs.
Pour appeler une telle méthode, l’appel doit être précédé du mot clé try, généralement dans un bloc do/catch.
Lorsque les erreurs sont throw, un enum de ErrorType peut être créé pour les différencier facilement.
Si l’erreur est typée, elle peut être catch dans une forme similaire au switch.

Deux ressources utiles ici et ici.

Availability

Le test #available(version) a été ajouté pour simplifier l’ajout de fonctionnalités propres aux nouvelles versions des OS.

if #available(iOS 8.0, OSX 10.10, watchOS 2, *) {
    ...
}

Protocol extensions

Nouveau moyen d’écrire moins de code pour en faire plus : il est possible de donner un code par défaut à une méthode protocol.

Migration

Pour faciliter le passage de Swift 1.2 à 2, XCode7 intègre un outil de migration pour modifier le code écrit en Swift 1.2 et le rendre compatible avec Swift 2.

Quelques liens utiles

Documentation Swift et historique des modifications.

Objective-C

Objective-C s’adjoint quelques fonctionnalités héritées de Swift et OS X.

Generics

Objective-C intègre enfin la Généricité dans sa boite à outil, ce qui était déjà présent dans Swift.

Par exemple il est maintenant possible de spécifier le type des objets que va contenir une collection (tableau, dictionnaire, set) :

@interface Wheel : NSObject
   @property (nonatomic, strong) UIColor *color;
@end

   @interface Vehicle : NSObject
   @property (nonatomic, copy) NSArray<Wheel *> *wheels;
@end

Attention le typage est toujours faible, l’ajout d’objet de type différent est donc toujours possible et des erreurs/crashs lors de l’utilisation sont par conséquent toujours envisageables.

Kindof

Également inspiré de Swift, Kindof permet d’ajouter/utiliser une classe fille dans une collection générique sans provoquer de warning à la compilation.

En reprenant l’exemple précédent :

@interface Vehicle : NSObject
   @property (nonatomic, copy) NSArray<__kindof Wheel *> *wheels;
@end

Nullability

Comme pour Swift, il maintenant possible de spécifier la « nullabilité » d’une propriété ou d’une variable.

@interface Wheel : NSObject
   @property (nonatomic, strong, nullable) UIColor *color;
   @property (nonatomic, strong, nonnull) UIColor *secondColor;
   @property (nonatomic, strong, null_unspecified) UIColor *thirdColor;
@end