Swift 2.0: Tilgjengelighet Checking

Swift 2.0: Tilgjengelighet Kontroll
19
Del
to
Del

Dette Cyber ​​mandag Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.

I denne korte opplæringen, jeg ønsker å fokusere på Swift splitter nye syntaks for tilgjengelighet sjekking. Hvis du har gjort et beløp av iOS eller OS X utvikling, så er jeg sikker på at du vet hvor kjedelig det kan være å sjekke om en bestemt API er tilgjengelig på enheten din søknad kjører på. I Swift 2, har dette blitt mye mindre av en smerte for utviklere.

Problemet

Se for deg følgende scenario. Du utvikler en iOS-applikasjon som er rettet mot iOS 7 og oppover. Under fjorårets WWDC lanserte Apple en ny API for varsling registrering
registerUserNotificationSettings (_:).

Betyr det at du trenger å heve din søknad deployering mål fra iOS 7 til iOS 8? Du kan gjøre det, men det ville forlate en betydelig del av programmets brukerbase i kulda, bare for å være i samsvar med Apples nye politikk for lokale og eksterne varslinger. Brukerne vil ikke takke deg for det.

Alternativet er å bare bruke den nye API på enheter som kjører iOS 8 og oppover. Det er mer fornuftig. Høyre? Gjennomføringen vil se omtrent slik ut
func program (applikasjon: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -. ≫ Bool {if UIApplication.instancesRespondToSelector ("registerUserNotificationSettings:") {la typer = UIUserNotificationType.Alert | UIUserNotificationType.Sound | UIUserNotificationType.Badge la settings = UIUserNotificationSettings (forTypes: typer, kategorier: nil) application.registerUserNotificationSettings (innstillinger)} return true}

Dette er et levedyktig alternativ, men det er ikke witout risiko. I denne opplæringen, vil jeg ikke gå inn i detaljer om hva disse risikoene innebære, men jeg vil understreke at de fleste utviklere synes det er greit å bruke de ovennevnte tilnærming. Eksempelet nedenfor viser en variant av denne tilnærmingen, denne gangen med Objective-C
hvis ([UIUserNotificationSettings klasse]). {[Applikasjons registerUserNotificationSettings: [UIUserNotificationSettings settingsForTypes: (UIUserNotificationTypeAlert | UIUserNotificationTypeSound | UIUserNotificationTypeBadge) kategorier: null]];}

Mens begge tilnærminger vil fungere i de fleste situasjoner, er det situasjoner der du vil støte på problemer. Noen APIer, for eksempel starte sine liv som private APIer og er offentliggjort på et senere tidspunkt. I dette scenariet, kan du ende opp med å trykke private APIer på enheter som kjører et operativsystem der disse API-ene er ikke offentlig ennå. Og jeg er sikker på at du vet hva det betyr.

The Solution

Takket være arbeidet til Swift team, er enkel og grei i Swift 2. Ta en titt løsningen på vårt problem ved følgende eksempel. Legg merke til at målet med prosjektet distribusjon er satt til iOS 7, bruker Swift 2 og Xcode 7.

I eksemplet vi bruker APIer som ble introdusert i iOS 8. Fordi kompilatoren vet at målet distribusjon av prosjektet er satt til iOS 7, kaster det en feil, forteller oss at APIene vi vil bruke, er kun tilgjengelig i iOS 8 og oppover. Det vet dette ved å inspisere SDK for informasjon om tilgjengelighet. Hvis du trykker på Kommando og klikk registerUserNotificationSettings (_ :) metoden, bør du se noe som dette
available (iOS 8.0, *) funk registerUserNotificationSettings (notificationSettings:. UIUserNotificationSettings)

Heldigvis Xcode gir oss en løsning på løse problemet. Det foreslår å bruke en versjon sjekk for å unngå at APIer eksklusivt til iOS 8 og opp kalles hvis våre brukere kjøre programmet på en eldre versjon av iOS.

Legg merke til at denne funksjonen ble introdusert i Swift 2. kompilatoren vil ikke kaste en feil hvis du bruker Swift 1.2. Tilsetningen av versjonskontroll gjør også det eksempel lettere å forstå. Ta en titt på den oppdaterte eksempelet nedenfor der vi følger rådene Xcode har givesn oss Anmeldelser func søknad - >. (Søknad: UIApplication, didFinishLaunchingWithOptions launchOptions:: [NSObject AnyObject]?) Bool {if #available (iOS 8.0, *) {la typer = UIUserNotificationType ([UIUserNotificationType.Alert, UIUserNotificationType.Sound, UIUserNotificationType.Badge]) la settings = UIUserNotificationSettings (forTypes: typer, kategorier: null) application.registerUserNotificationSettings (innstillinger) } return true}

Syntaksen er klar og forståelig. Bruke tilgjengelighet syntaks, sjekker vi om programmet kjører på en enhet med iOS 8 og oppover. Hvis det ikke er det, hvis klausulen er hoppet over, ellers programmet kaller den nye API for varsling registrering.

Syntax

Syntaksen er grei. Vi starter tilgjengeligheten tilstand med #available og pakk tilstanden i parentes. Vi kan legge til så mange plattformer som nødvendig, separere listen over plattformer med komma.
Hvis #available (iOS 8.0, OSX 10.10, watchOS 2 *) {...}

Merk at vi ender på listen over plattformer med en stjerne. Denne stjernen er nødvendig, og indikerer at dersom klausulen kjøres på minimum mål for alle plattformer som ikke er inkludert i listen over plattformer distribusjon.

Som vi så tidligere, kan vi brukeavailable attributt til legge informasjon om tilgjengelighet til funksjoner, metoder og klasser. I følgende eksempel, forteller vi kompilatoren at useFancyNewAPI bør bare kalles på enheter som kjører iOS 9 og oppover.
available (IOS 9.0, *) func useFancyNewAPI () {...}
Konklusjon

Husk at tilgjengeligheten syntaks er ikke et alternativ for de to eksemplene jeg viste deg i 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.

anvendelighet syntaks er enda en grunn til å migrere Swift prosjekter til Swift 2. Det blir kvitt utsatt for feil løsninger for å sjekke API tilgjengelighet. Verden ser litt vennligere med Swift 2. Doens't det? Anmeldelser



Previous:
Next Page: