2017-09-02 27 views

回答

7

这语法是:https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html#//apple_ref/doc/uid/TP40014097-CH25-ID521

考虑:

protocol Meh { 
    func doSomething(); 
} 

//Extend protocol Meh, where `Self` is of type `UIViewController` 
//func blah() will only exist for classes that inherit `UIViewController`. 
//In fact, this entire extension only exists for `UIViewController` subclasses. 

extension Meh where Self: UIViewController { 
    func blah() { 
     print("Blah"); 
    } 

    func foo() { 
     print("Foo"); 
    } 
} 

class Foo : UIViewController, Meh { //This compiles and since Foo is a `UIViewController` subclass, it has access to all of `Meh` extension functions and `Meh` itself. IE: `doSomething, blah, foo`. 
    func doSomething() { 
     print("Do Something"); 
    } 
} 

class Obj : NSObject, Meh { //While this compiles, it won't have access to any of `Meh` extension functions. It only has access to `Meh.doSomething()`. 
    func doSomething() { 
     print("Do Something"); 
    } 
} 

下面将给出一个编译器错误,因为的OBJ没有获得咩扩展功能。

let i = Obj(); 
i.blah(); 

但是,下面的工作。

let j = Foo(); 
j.blah(); 

换句话说,Meh.blah()只提供给那些UIViewController类型的类。

+0

感谢布兰登。现在我懂了。 – Mini2008

0

这里是说明一个例子有什么用,其中自我:UIViewController中

protocol SBIdentifiable { 
    static var sbIdentifier: String { get } 
} 

extension SBIdentifiable where Self: UIViewController { 
    static var sbIdentifier: String { 
     return String(describing: self) 
    } 
} 

extension UIVieWcontroller: SBIdentifiable { } 

class ViewController: UIViewController { 
    func loadView() { 
    /*Below line we are using the sbIdentifier which will return the 
    ViewController class name. 
    and same name we would mentioned inside ViewController 
    storyboard ID. So that we do not need to write the identifier everytime. 
    So here where Self: UIViewController means it will only conform the protocol of type UIViewController*/ 

    let viewController = self.instantiateViewController(withIdentifier: 
    self.sbIdentifier) as? SomeBiewController 
    } 
}