Swift 2 Tilgjengelighetskontroll

I denne korte opplæringen vil jeg gjerne fokusere på Swifts helt nye syntaks for tilgjengelighetskontroll. Hvis du har gjort noen mengde iOS eller OS X-utvikling, så er jeg sikker på at du vet hvor kjedelig det kan være å kontrollere om en bestemt API er tilgjengelig på enheten din søknad kjører på. I Swift 2 har dette blitt mye mindre smerte for utviklere.

Problemet

Bilde følgende scenario. Du utvikler et iOS-program som er målrettet mot iOS 7 og oppover. I løpet av fjorårets WWDC introduserte Apple en ny API for varslingsregistrering.

registerUserNotificationSettings (_ :) 

Betyr det at du må øke programmets distribusjonsmål fra iOS 7 til iOS 8? Du kan gjøre det, men det ville etterlate en betydelig del av programmets brukerbase i kulde, bare for å overholde Apples nye policy for lokale og eksterne varsler. Brukerne dine vil ikke takke deg for det.

Alternativet er bare å bruke den nye APIen på enheter som kjører iOS 8 og oppover. Det gir mer mening. Ikke sant? Gjennomføringen vil se noe ut som dette.

func program (søknad: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool if UIApplication.instancesRespondToSelector ("registerUserNotificationSettings:") let types = UIUserNotificationType.Alert | UIUserNotificationType.Sound | UIUserNotificationType.Badge la settings = UIUserNotificationSettings (forTypes: types, categories: null) application.registerUserNotificationSettings (settings) return true 

Dette er et levedyktig alternativ, men det er ikke uten risiko. I denne opplæringen vil jeg ikke gå inn i detaljene om hva disse risikoene innebærer, men jeg vil understreke at de fleste utviklere synes det er greit å bruke den ovenfor angitte tilnærmingen. Følgende eksempel viser en variant av denne tilnærmingen, denne gangen med Objective-C.

hvis ([UIUserNotificationSettings class]) [programregisterUserNotificationSettings: [UIUserNotificationSettings settingsForTypes: (UIUserNotificationTypeAlert | UIUserNotificationTypeSound | UIUserNotificationTypeBadge) kategorier: null]];  

Mens begge tilnærmingene vil fungere i de fleste situasjoner, er det situasjoner der du får problemer. Noen APIer, for eksempel, starter deres liv som private APIer og blir offentliggjort senere. I dette tilfellet kan du ende opp med å trykke på private APIer på enheter som kjører et operativsystem der disse APIene ikke er offentlige ennå. Og jeg er sikker på at du vet hva det betyr.

Løsningen

Takket være Swift-teamets arbeid er løsningen på problemet vårt enkelt og grei i Swift 2. Ta en titt på følgende eksempel. Legg merke til at distribusjonsmålet for prosjektet er satt til iOS 7, ved hjelp av Swift 2 og Xcode 7.

I eksemplet bruker vi APIer som ble introdusert i IOS 8. Fordi kompilatoren vet at distribusjonsmålet for prosjektet er satt til iOS 7, kaster det en feil, og forteller oss at APIene vi vil bruke er bare tilgjengelige i iOS 8 og oppover. Den vet dette ved å inspisere SDK for tilgjengelighetsinformasjon. Hvis du trykker på Kommando og klikk på registerUserNotificationSettings (_ :) metode, bør du se noe sånt.

@available (iOS 8.0, *) func registerUserNotificationSettings (notificationSettings: UIUserNotificationSettings) 

Heldigvis gir Xcode oss en løsning for å løse problemet. Det foreslår at du bruker en versjonskontroll for å unngå at APIene eksklusive til iOS 8 og opp kalles hvis brukerne kjører programmet på en eldre versjon av iOS.

Merk at denne funksjonen ble introdusert i Swift 2. Kompilatoren vil ikke kaste en feil hvis du bruker Swift 1.2. Tillegget av versjonskontrollen gjør også eksemplet lettere å forstå. Ta en titt på det oppdaterte eksempelet nedenfor, der vi følger råd Xcode har gitt oss.

Funk-applikasjon (søknad: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool if #available (iOS 8.0, *) la types = UIUserNotificationType ([UIUserNotificationType.Alert, UIUserNotificationType.Sound, UIUserNotificationType.Badge]) la settings = UIUserNotificationSettings (forTypes: types, categories: null) application.registerUserNotificationSettings (settings) return true 

Syntaxen er klar og forståelig. Ved hjelp av tilgjengelighetssyntaxen, kontrollerer vi om programmet kjører på en enhet med iOS 8 og oppover. Hvis ikke, er det hvis klausulen hoppes over, ellers kaller programmet den nye API for varslingsregistrering.

syntax

Syntaxen er grei. Vi starter tilgjengelighetsbetingelsen med #tilgjengelig og vikle tilstanden i parentes. Vi kan legge til så mange plattformer som nødvendig, å skille listen over plattformer med kommaer.

hvis # tilgjengelig (iOS 8.0, OSX 10.10, watchOS 2, *) ... 

Legg merke til at vi avslutter listen over plattformer med en stjerne. Denne stjernen er nødvendig og indikerer at hvis klausulen utføres på minimum distribusjonsmål for en hvilken som helst plattform som ikke er inkludert i listen over plattformer.

Som vi så tidligere, kan vi bruke @tilgjengelig Tilordne å legge til tilgjengelighetsinformasjon for funksjoner, metoder og klasser. I følgende eksempel forteller vi kompilatoren at useFancyNewAPI bør bare kalles enheter som kjører iOS 9 og oppover.

@available (iOS 9.0, *) func useFancyNewAPI () ... 

Konklusjon

Husk at tilgjengelighetssyntaxen ikke er et alternativ for de to eksemplene jeg viste deg ved starten av denne opplæringen. Disse eksemplene er feil og bør bare brukes hvis du bruker Objective-C eller en tidligere versjon av Swift.

Syntaxen for tilgjengelighet er enda en grunn til å overføre Swift-prosjektene til Swift 2. Det blir kvitt feilproblemer for å sjekke tilgjengeligheten til API. Verden ser litt vennligere ut med Swift 2. Gjør det ikke?