/ / Prečo a kedy by sme mali používať voliteľné funkcie (v Swifte)? - rýchly

Prečo a kedy by sme mali používať voliteľné funkcie (v Swift)? - rýchle

Mám nasledujúce otázky týkajúce sa voliteľnej funkcie:

@objc protocol SSRadioButtonControllerDelegate {
/**
This function is called when a button is selected. If "shouldLetDeSelect" is true, and a button is deselected, this function
is called with a nil.

*/
optional func didSelectButton(aButton: UIButton?)
}
  1. Čo je voliteľná funkcia? Prečo nemusí deklarovať metódu? Na čo slúži?
  2. prečo @objc protokol namiesto @protocol?

odpovede:

1 pre odpoveď č. 1

Protokol informuje delegáta, že ste vybrali tlačidlo UIButton.

Voliteľná metóda tohto protokolu informuje delegáta, ak je tlačidlo vybraté.

Používame @objc atribút, ak chceme v protokole Swift použiť voliteľnú metódu.

@objc protocol SSRadioButtonControllerDelegate: class {
optional func shouldLetDeSelect(sender: SSRadioButtonController) -> Bool
func didSelectButton(sender: UIButton?)
}

To tiež znamená, že štruktúra alebo výčet Swift už nemôžu prijať tento protokol. Ale to nevadí, pretože ste už tento protokol triedy vytvorili.

Atribút @objc sa nezdá byť Swift-y. Takže keď si myslíme, že v protokole Swift potrebujeme voliteľnú metódu, aké sú naše alternatívy?

Presuňte voliteľnú metódu do samostatného protokolu:

protocol SSRadioButtonControllerDelegate: class {
func shouldLetDeSelect(sender: SSRadioButtonController) -> Bool
}

Potom sa môžete prípadne rozhodnúť prijať a implementovať túto novú metódu delegovania do svojho ovládača hlavného pohľadu.

controller.delegate = self
// Uncomment if we need to implement shouldLetDeSelect:
// controller.ButtonSelectionDelegate = self

Ďalším prístupom je poskytnúť predvolenú implementáciu pre „voliteľnú“ metódu v rozšírení. Definíciu protokolu môžeme vyčistiť odstránením atribútov @objc a voliteľných atribútov:

protocol SSRadioButtonControllerDelegate: class {
func shouldLetDeSelect(sender: SSRadioButtonController) -> Bool
func didSelectButton(sender: UIButton?)
}

Metóda je teraz povinná a musí byť niekde implementovaná.

extension SSRadioButtonControllerDelegate {
func shouldLetDeSelect(sender: SSRadioButtonController) -> Bool {
return true
}
}

0 pre odpoveď č. 2

Ak v takomto prípade používate protokoly, trieda, ktorú budete používať, musí vyhovovať protokolu.

protokoly môže vyžadovať konkrétne inštančné metódy a typmetódy, ktoré sa majú implementovať vyhovujúcimi typmi. Tieto metódy sú písané ako súčasť definície protokolu rovnakým spôsobom ako metódy bežnej inštancie a typu, ale bez zložených zátvoriek alebo tela metódy. Variadické parametre sú povolené, platia rovnaké pravidlá ako pre bežné metódy. Predvolené hodnoty však nie je možné určiť pre parametre metódy v rámci definície protokolu.

voliteľný funkcia nie je vyžadovaná pre delegáta konformácie, rovnako ako zobrazenie tabuľky vo vnútri požadovanej metódy a voliteľnej funkcie. Môžete použiť podľa vašich požiadaviek.

Trieda jedna

import UIKit

//Here you creating protocol
@objc protocol MangoDelegate {
func eatmango()
optional func donoteat()
}

class ProtocolController: UIViewController {

var delegate: MangoDelegate?


override func viewDidLoad() {
super.viewDidLoad()

}

}

Trieda druhá tu pomocou protokolu

import UIKit

class ViewController: UIViewController , MangoDelegate {

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}

//MARK: - delegate method
func eatmango(){

}

}

V tomto kóde používam iba požadovanú funkciu a voliteľný protokol, ktorý nevyhovuje.

bez protokolu o zhode s metódou

tu zadajte popis obrázku

@ Pokúste sa tu prispôsobiť protokol s voliteľnou funkciou, ale opäť potrebujete konformáciu

tu zadajte popis obrázku

skúste tu s požadovanou funkciou

tu zadajte popis obrázku

a skúsil s oboma funkciami

tu zadajte popis obrázku


0 pre odpoveď č. 3

Čo je voliteľná funkcia?

A voliteľná funkcia je funkcia deklarovaná v protokole, ktorá nemusí byť implementovaná triedami, ktoré sú v súlade s takýmto protokolom.


Prečo nemusí deklarovať metódu?

Pretože je to voliteľné.


Načo to je?

Príklad je pravdepodobne najlepší spôsob, ako odpovedať na túto otázku.

Máte protokol Bird. (Technicky by tento protokol mal byť triedou, bol to však prvý príklad z mojej hlavy.)

V tomto protokole máte povinné údaje eat() a voliteľné fly().

Máte 2 triedy implementujúce protokol Bird: Dodo a Eagle. (Z technického hľadiska by opäť malo ísť o podtriedy triedy Bird, ale toto je iba jednoduchý príklad.)

Dodo a Eagle obaja musia implementovať eat(), pretože oni (dúfajme) obaja jedia.

Pokiaľ však ide o lietanie, orly áno (za predpokladu, že obe krídla sú funkčné), ale dodos don "t. Takže by ste mali implementovať fly() pre Eagle ale nie pre Dodo.


0 pre odpoveď č. 4

Ak sa chcete vyhnúť funkcii @objc, ale stále máte výhodu voliteľných funkcií, jednoducho rozšírite protokol o prázdne (alebo predvolené) implementácie funkcií protokolu, napr. -

protocol MyProtocol: class {
func myFunc()
}

extension MyProtocol {
func myFunc() {
// do nothing (or something...)
}
}

To znamená, že vo svojej triede nemusíte funkciu implementovať