App maken: ook jij kunt het leren!

 

de iOS Academie Forums

Forums - iOS Academie - Algemeen: verschil tussen "cell.textLabel!.text" en "cell.textLabel?.text"

Yvo  Yvo heeft nog geen Studiekaart. Klokje24 nov 2015, 10:46
Avatar
Avatar
Berichten:7


Ik zit met de vraag wat het verschil is tussen '?' en '!' in dit stukje code uit les 22:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

let cell = tableView.dequeueReusableCellWithIdentifier("onzeCell", forIndexPath: indexPath)

cell.textLabel?.text = "Swift!"

return cell

}

en met name de '?' in deze regel:

cell.textLabel?.text = "Swift!"

>zowel '!' als '?' werken en geven hetzelfde resultaat.
Reageer


AppChanger  Laurens heeft nog geen Studiekaart. Klokje24 nov 2015, 22:00
Avatar
Avatar
Berichten:301
Fans:13


Hoi Yvo,

In het boek van Roelf staat dit perfect uitgelegd.

Ik leg het kort uit. Een variabele of en property kan zowel iets van data bevatten als leeg zijn. Als een Variabele leeg is, dan is deze "nil", dit wil zeggen dat de variabele geen inhoud heeft. Alleen variabelen die optional zijn kunnen nil zijn. Als je in je code een variabele zijn waarde gaat gebruiken en deze is "nil", dan crasht het programma. Dit omdat deze niet weet wat het moet doen aangezien het geen waarde krijgt. Je kan van een variabele een optional maken, dit wil zeggen dat deze een "nil" kan bevatten en hier op getest kan worden. BVB. een variabele die optional is en het datatype String verwacht:  var variabele: String? = nil Deze var heeft nog geen waarde, hij is dus nil

 

We kunnen testen of een variabele data bevat door optional binding:

Een voorbeeld:

if let variabele = optionalVariabele {
    uitGepakteVar = variabele
    // Nu kan je de uitgepakte variabele gebruiken.
}

Stel, je wil de inhoud van optional "optionalVariabele" gebruiken. Maar alleen als deze al gevuld is. Dit kan je dan doen door de "if let" constructie. Je gaat dus kijken of de variabele "optionalVariabele" niet "nil" is. Indien de variabele niet "nil" is, dan wordt de waarde van "optionalVariabele" doorgegeven aan de variabele "variabele". Nu kan je binnen de haakjes iets doen met de inhoud van de oorspronkelijke variabele "optionalVariabele".

Stel dat "optionalVariabele" wel "nil" was, dan wordt de code binnen de haakjes niet uitgevoerd en wordt er geen crash veroorzaakt.
Je weet dan bijvoorbeeld dat de gebruiker nog niet is ingelogd omdat de variabele waar het wachtwoord in bewaard wordt nog leeg is.

Wat wil dit nu zeggen?

cell.textLabel?.text = "Swift!"

Je wil een tekst tonen in een textlabel in een cell. Het kan zijn dat de property "textLabel" nil is (er is geen waarde). Door nu een ? achter textLabel te plaatsen zeggen we tegen swift dat enkel als textLabel niet gelijk is aan nil er iets mag gewijzigd worden (in dit geval de text gelijk maken aan "Swift!"),

Indien textLabel toch nil is zal de text niet worden doorgegeven.

Je kan het vraagteken vervangen door een ! teken. Met het ! teken geef je aan dat je zeker bent dat textLabel niet nil is en je ze direct wil gebruiken (unwrappen).

Hopelijk helpt dit je al een beetje voort!

En nog een kleine tip, koop de cursus van Roelf, deze legt alles zeer goed uit en is niet zo duur!

Met vriendelijke groeten,

Laurens


Reageer


Yvo  Yvo heeft nog geen Studiekaart. Klokje25 nov 2015, 09:53
Avatar
Avatar
Berichten:7


Hoi Laurens,

Prima uitleg, bedankt hiervoor. het verhaal van cell.textLabel?.text = "Swift!" is nu duidelijk!

Rest mij nog één vraag: wat is nu het verschil bij de declaratie tussen '?' en '!' bij een simpele variabele.

var a: String?

var b: String!

Beide werken maar dat verschil is mij nog niet duidelijk.

Ik heb zowel de boeken als de video hoor en die zijn inderdaad prima, ik kan ze iedereen warm aanbevelen.
Alleen ben ik halverwege het boek overgeschakeld naar de video lessen. 
Programeren is voor mij niet nieuw Swift wel, voorheen c, c++ en objectieve-c gebruikt. Er zijn tussen Swift en Objective-c toch aardig wat verschillen.
Normaal komt je, als je al wat ervaring hebt, een heel eind met de video's alleen. Wat veel zegt over de kwaliteit ervan.
Alleen, in les 22 komt dan ineens het ? tevoorschijn en in de vorige video's spreekt Roelf hier niet over :-(

Ter info: In je antwoord is er ergens iets misgelopen met de tekst, die loopt oneindig door bij mij in Safari aan de linker kant. Heb hem wel kunnen lezen door te kopiëren en in Teksteditor te plakken.

Nogmaals bedankt voor je antwoord!

 

Yvo

Reageer


AppChanger  Laurens heeft nog geen Studiekaart. Klokje25 nov 2015, 10:20
Avatar
Avatar
Berichten:301
Fans:13


Hoi Yvo,

Over de text die doorloopt, soms durft de text van opmaak veranderen en wordt er niet automatisch een nieuwe regel weergegeven. Zou me wel verbazen moest Roelf nog nooit iets gezegd hebben in de video's over optionals en zo voort.

var a: String?

Hier geeft je aan dat de mogelijkheid bestaat dat de variabele "nil" is. Je maakt er een optional van. Hierdoor kan je dan in latere code bekijken of er een inhoud is.

Dit kan zeer handig zijn voor bijvoorbeeld te checken of de user al ingelogd is. Als je een variabele maakt waar als de gebruiker ingelogd is zijn gebruikersnaam in komt. Je declareert bijvoorbeeld "username: String? = nil" dan ga je in je viewDidLoad methode kijken of er een gebruikersnaam is (bvb. Via userdefault) . Als dit het geval is, dan maak je de variabele "username" inhoud gelijk aan de naam. Nu kan je overal in je code testen of er een gebruikersnaam is met de "if let" methode. Als deze slaagt, dan is er een username (user is ingelogd), anders is de variabele "username" nil , en is hij niet ingelogd.

var b: String! 

Hier geeft je aan dat de variabele  altijd een inhoud heeft, dus nooit nil zal zijn.

Swift werkt inderdaad wel wat anders al Objective-C, maar eens je er mee weg bent wil je nooit meer terug! Dan denk je bij elke regel die je typt in een andere taal, waarom zo moeilijk doen, in swift die ik dat met één regel.

Mvg,

Laurens

Reageer

Goed advies! 1 persoon vindt dit goed advies.

Yvo  Yvo heeft nog geen Studiekaart. Klokje25 nov 2015, 10:40
Avatar
Avatar
Berichten:7


Laurens,

Roelf heeft het zeker al over optionals gehad en ik had het helemaal door totdat "cell.textLabel?.text" ineens gebruikt werd.
Dan ben ik de trappers kwijt geraakt maar door uw uitleg ben ik weer bij! 

De declartie "var iets: String?" is altijd gebruikt maar nog nooit "var iets: String!". 

In ieder geval ga ik het boek ook verder doornemen voordat ik verder ga na les 23.

Nogmaals bedankt!

 

Yvo

Reageer

Leuk! 1 persoon vindt vindt dit leuk.

AppChanger  Laurens heeft nog geen Studiekaart. Klokje25 nov 2015, 10:51
Avatar
Avatar
Berichten:301
Fans:13


Yvo,

var iets: String! zal meestal als volgt gedeclareerd worden var iets: String = "mijnString"

Je kan er een uitroepteken achter zetten, maar een string kan nooit nil zijn als je hem gebruikt, door dan het vraagteken te plaatsen kan dit wel (dan moet je wel testen of hij nil is).

Meestal laat je Swift zelf het datatype bepalen. ( var iets = "mijnString") Door type afleiding weet swift dat dit een string is.

Je kan" iets: String! = nil" gebruiken als je zeker weet dat hij wordt gevuld voor je hem gebruikt.

Met vriendelijke groeten,

Laurens

Reageer


Admin Roelf  Klokje26 nov 2015, 10:52
Avatar


Yvo,

Het fenomeen cell.textLabel?.text heet optional chaining en is relatief nieuw. In de laatste versie van het eBook (versie 2.12, kun je gratis downloaden als je het eBook al hebt aangeschaft) lees je hier meer over (in hoofdstuk 12).

Nadat ik klaar ben met deel 3 van de serie Apps bouwen met Swift, begin ik met opnames van nieuwe video's: eerst voor de vervolgcursus UIKit in de praktijk en dan voor de cursus Wat je over Swift moet weten. Als je die cursus al hebt aangeschaft, krijg je de nieuwe video's (waarin ook deze nieuwe manier van met optionals werken wordt behandeld) er gratis bij :)

Overigens:

var iets: String!

betekent: maak een "impliciet uitgepakte" optional. Je hoeft er dus geen initializer voor te schrijven, maar zorg wel dat hij een waarde bevat voordat je hem gebruikt!

 

Reageer

Goed advies! 1 persoon vindt dit goed advies.