App maken: ook jij kunt het leren!

 

de iOS Academie Forums

Forums - Producten van de iOS Academie - De videocursus: Wat je over Swift moet weten: Bonus video na les 24

Hans  Hans heeft nog geen Studiekaart. Klokje30 apr 2015, 12:23
Avatar
Avatar
Berichten:7


Hoi allen,

 

In BlokView.swift kan swift 1.2 niet overweg met super.init() op regel 46

Het verbaast mij ook dat bij de beschrijving van de functie init de code niet vooraf gegaan wordt met het woord "func"

foutmelding:

/Desktop/Swift/Blokken/Blokken/BlokView.swift:46Zelf zo'n smiley gebruiken? Typ dan :2: in je tekst en de rest gaat vanzelf! Kijk in het Woordenboek voor een overzicht van alle smileys. Must call a designated initializer of the superclass 'UIView'

 

Heeft iemand een ide om deze fout op te lossen?

Vriendelijke groet,

 

Hans

Reageer


Admin Roelf  Klokje30 apr 2015, 14:29
Avatar


Maarten, in iOS 8.2 en later is dit gewijzigd. Vervang regel 46 van BlokView.swift als volgt:

super.init()

wordt:

super.init(frame: CGRectZero)

Zet vooral niet het woord 'func' voor de init!  het woord init op zich is genoeg om aan te geven dat je een initializer maakt. Het enige dat veranderd is, is dat er niet langer een init() bestaat voor UIViews (vandaar de foutmelding).

Er is overigens nog iets: casting is ook veranderd. Het werkt nu als volgt:

as : Xcode (of liever gezegd, de compiler) kan zelf controleren of de cast slaagt (en genereert een fout als de cast onjuist is).

as! : Jij (dus de programmeur) garandeert dat de cast slaagt, ook als de compiler dat zelf niet kan bepalen. Dit kan crashes opleveren als je je vergist, dus kijk hiermee  uit!

as? : Je krijgt een optional terug als de cast slaagt; anders krijg je nil terug.

Wijzig regel 34 van ViewController.swift als volgt:

let recognizer = sender as UITapGestureRecognizer

wordt (de 'gevaarlijke' manier, waarbij je app kan crashen als je een foute cast uitvoert):

let recognizer = sender as! UITapGestureRecognizer

of (de 'veilige' manier, waarbij er niets gebeurt als je een foute cast uitvoert):

if let recognizer = sender as? UITapGestureRecognizer {
  let point = recognizer.locationInView(self.view)
  let animatietijd = minimaleTijdsduur + maximaleTijdsduur - slider.value
  let nieuwBlok = BlokView(point: point, tijdsduur: animatietijd)
  self.view.addSubview(nieuwBlok)
}

De voorbeeldbestanden bij deze les zijn overigens aangepast.

Bedankt voor het melden - en succes!

Reageer

Goed advies! 3 personen vinden dit goed advies.

Sp@rkie  Robert heeft nog geen Studiekaart. Klokje01 mei 2015, 07:52
Avatar
Avatar
Berichten:9


Ik liep zelf ook tegen de casting wijzigingen aan. Bedankt voor de kortbondige uitleg wat het verschil is as vs as! vs as?

Reageer


Jan  Op de eerste vier stappen van zijn/haar studiekaart scoort Jan 75%. Klokje02 mei 2015, 14:16
Avatar
Avatar
Berichten:35


Hallo,

over casting als as? werd door het systeem al aangegeven. Prima.

Wat mij verbaasd is wel dat ingrijpende wijzigingen primair als fout worden gerapporteerd zonder duidelijke oplossingen aan te geven.

Denk aan super.init() dat super.init(frame: CGRectZero) wordt,.

Hoe kom je hierachter?     Blijf maar zoeken en proberen ??? Worden hiervan releases uitgegeven?

Reageer


AppChanger  Laurens heeft nog geen Studiekaart. Klokje03 mei 2015, 22:42
Avatar
Avatar
Berichten:301
Fans:13


Dag Jan,

Bij elke nieuwe build van xcode wordt er een release notes vrij gegeven. In dead note staan alle veranderingen genoteerd. Je kan deze vinden in het dev portal via iOS. Via Google vind je ze ook wel.

link: adcdownload.apple.com/developer_tools/xcode_6.4_beta_2/xcode_6.4_beta_2_release_notes.pdf

Met vriendelijke groeten,

Laurens

Reageer

Goed advies! 1 persoon vindt dit goed advies.