you ’ re (probably) doing it wrong
on kulunut noin kahdeksan kuukautta siitä, kun ensimmäisen kerran päätin hypätä täysin Swiftin madonreikään. Noiden kuukausien aikana olen hitaasti oppinut lopettamaan Objective-C-tyylisten koodikuvioiden kirjoittamisen Swift-syntaksilla ja alkanut todella hyödyntää uutta kieltä.
mutta yksi asia, jonka olen viime aikoina havainnut, on se, että käytän edelleen rumaa ei-Swiftin kaltaista syntaksia kaikilla CGGeometry
rakenteilla.
CGRect, CGSize, CGPoint
C-syntaksi. Lammas suden vaatteissa
minulla on iso tunne, että moni Swiftin Kehittäjä syyllistyy tähän. Käsi ylös, jos olet käyttänyt jompaakumpaa näistä koodissasi:
let rect = CGRectMake(0, 0, 100, 100)let point = CGPointMake(0, 0)let size = CGSizeMake(100, 100)
Update: Swift 3: sta lähtien nämä funktiot on poistettu.
Kyllä, ajattelin niin. Mutta älä huoli, siinä ei ole mitään hävettävää …vielä.
tässä on se vika, että se rikkoo Swiftin koodauskäytäntöä, se toimii edelleen, mutta se näyttää paljon enemmän sellaiselta, että jos se kuuluu Objective-C: hen tai vaikka, uskallanko sanoa, Javaan. * shudders *
kokeneelle iOS-tai OSX-kehittäjälle, lyhyellä vilkaisulla he voisivat helposti kertoa, mitä tuo koodi tekee. He eivät tarvitse argumenttimerkintöjä CGGeometry
rakenteita, koska kaikki tuntevat nuo argumentit ja niiden järjestyksen ulkoa.
suuri osa Swiftin tarkoituksesta on ystävällisyyttä kielen tulokkaille sekä ohjelmoinnin aloittajille. Jos he katsoisivat koodia, he eivät tietäisi, mitä numerot edustavat. Vannokaamme siis kaikki olevamme hyviä Swift-kansalaisia ja alkakaamme käyttää Swift-versioita:
let rect = CGRect(x: 0, y: 0, width: 100, height: 100)let size = CGSize(width: 100, height: 100)let point = CGPoint(x: 0, y: 0)
hieman ylimääräistä syntaksia, koodimme monisanaisuus on ensisilmäyksellä täysin ymmärrettävää. Lisäbonuksena CGGeometry
struct initializer on myös se, että nyt emme vain käytä CGFloat
argumentteina, vaan voimme myös siirtää Int
ja Double
!
nolla
let rect = CGRectZerolet size = CGSizeZerolet point = CGPointZero
päivitys: Swift 3: sta lähtien nämä funktiot on poistettu.
kun me ollaan siinä, niin käytät varmaan vielä näitäkin, amirite? lel.
näitä pitäisi myös päivittää käyttämään uudempaa, nopeampaa syntaksia. Mutta ei hätää, syntaksi on vain vain ylimääräinen merkki pidempi. Arvaatko, mikä se on?
let rect = CGRect.zerolet size = CGSize.zerolet point = CGPoint.zero
toinen asia, joka saa sinut mukaan tähän on se, että Xcode ’ s syntax highlighter korostaa värimaailmastasi riippuen .zero
, tehden siitä sen verran hieman kevyemmän kognitiiviselle kuormituksellesi.
Arvohaku
CGRect frame = CGRectMake(0, 0, 100, 100)CGFloat width = CGRectGetWidth(frame)CGFloat height = CGRectGetHeight(frame)CGFloat maxX = CGRectGetMaxX(frame)CGFloat maxY = CGRectGetMaxY(frame)
Update: Swift 3: sta lähtien nämä funktiot on poistettu.
Jos olisit tai olet edelleen hyvä Objective-C: n kansalainen, olisit käyttänyt näitä arvoherättimiä, kun olisit halunnut tietyn arvon rect: lle. Mutta hetkinen, miksi emme vain pääse käsiksi arvoihin suoraan?
CGFloat width = frame.size.widthCGFloat height = frame.size.height
tästä syystä sovellusten tulisi välttää suoraan CGRect-tietorakenteeseen tallennettujen tietojen lukemista ja kirjoittamista. Käytä sen sijaan tässä kuvattuja funktioita suorakulmioiden manipulointiin ja niiden ominaisuuksien hakemiseen.
— Apple, CGGeometry Reference Documentation
on varmaan vielä paljon teitä, jotka eivät viitsineet tällaisia muodollisuuksia, mutta ei se mitään. Swift on lieventänyt meitä tällaisen unpretty API ja sen sijaan tarjotaan yksinkertainen piste merkintä muuttujia.
let frame = CGRect(x: 0, y: 0, width: 100, height: 100)let width = frame.widthlet height = frame.heightlet maxX = frame.maxXlet maxY = frame.maxY
on paljon enemmän esimerkkejä näistä mukavuuksista saatavilla Swift playgrounds I ’ ve provided to supplement this post. Linkki on sivun alareunassa.
muunneltavuus
let frame = CGRect(x: 0, y: 0, width: 100, height: 100)let view = UIView(frame: frame)view.frame.origin.x += 10
ei ainoastaan pysty muuttamaan näkymän kehyksen yksittäisiä arvoja, vaan pystyy myös korvaamaan kokonaisia alirakenteita kokonaan. Katso:
let view = UIView(frame: .zero)view.frame.size = CGSize(width: 10, height: 10)view.frame.origin = CGPoint(x: 10, y: 10)
jo tämä pieni ominaisuus riittää syyksi lopettaa Objective-C: n käyttö CGRect
s ilman, että tarvitsee luoda kokonaan uutta ja nollata arvoa. Se oli vain alle kaksi vuotta sitten, että me Objective-C kehittäjät oli pakko kirjoittaa kehyksen muutos koodi näin:
CGRect frame = CGRectMake(0, 0, 100, 100);UIView *view = initWithFrame: frame];CGRect newFrame = view.frame;newFrame.size.width = view.frame.origin.x + 10;view.frame = newFrame;
i don ’ t know about you, but writing that really stressed me out. Luodaan newFrame
rakenne view
’s frame, muutetaan sitä ja sitten nollataan frame
ominaisuus view
uudelleen. Ei kiitos, ei enää koskaan.
älä unohda
Uikitin sisällä on myös pari muuta konstruktiota, joihin nämä muutokset soveltuvat:
UIEdgeInsets var edgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
edgeInsets.top += 10UIOffsetvar offset = UIOffset(horizontal: 10, vertical: 10)
offset.vertical += 10