2016-06-05 31 views
5

sto creando un quadro chiamato MyFramework contenente LoginProtocol.swift che ha alcuni comportamenti predefinitiprotocollo di estensione, non è conforme al protocollo

import UIKit 

public protocol LoginProtocol { 
    func appBannerImage() -> UIImage? 
    func appLogoImage() -> UIImage? 
} 


extension LoginProtocol { 
    func appBannerImage() -> UIImage? { 
     return (UIImage(named: "login_new_top")) 
    } 

    func appLogoImage() -> UIImage? { 
     return (UIImage(named: "appLogo")) 

    } 
} 

Avanti, sto aggiungendo un nuovo obiettivo di creare un'applicazione demo chiamato MyDemoApp che sta usando MyFramework:

import UIKit 
import MyFramework 

class LoginViewContainer: UIViewController, LoginProtocol {  
    // I think I am fine with defaults method. But actually getting an error 
} 

Attualmente, sto ottenendo un errore del compilatore, come

type 'LoginViewContainer does not conform protocol 'LoginProtocol' 

io non sono sicuro perché sto ottenendo questo messaggio perché con l'estensione del protocollo, la classe non ha bisogno di uniformare i protocolli

Sarebbe bello se riesco a ottenere alcuni consigli su questo issue.Thanks

PS: this è un collegamento per questi codici. sentiti libero di guardarlo

+3

propria estensione non è pubblico – Hamish

+0

@ originaluser2: buona pesca. apprezza la tua risposta Mi salvi ore. – tonytran

+0

Non tecnicamente una risposta;) Felice di aiutare, sentitevi liberi di eliminare la domanda ora - a meno che non riteniate che sarebbe utile per gli altri, nel qual caso potrei * scrivere una risposta reale. Ciò che è importante è che questa domanda non appaia "irrisolta" nel mondo esterno. – Hamish

risposta

6

Il problema è che il tuo extension non è pubblico, pertanto non è visibile al di fuori del modulo in cui è definito, in questo caso MyFramework.

Ciò significa che il controller di visualizzazione conosce solo la definizione LoginProtocol (dato che questo è pubblico), ma non l'implementazione predefinita. Pertanto il compilatore si lamenta dei metodi di protocollo non implementati.

La soluzione è quindi quello di fare semplicemente l'estensione pubblico:

public extension LoginProtocol { 
    func appBannerImage() -> UIImage? { 
     return (UIImage(named: "login_new_top")) 
    } 

    func appLogoImage() -> UIImage? { 
     return (UIImage(named: "appLogo")) 

    } 
}