protocol SomeProtocol { // protocol definition goes here }
protocol SomeProtocol { var mustBeSettable: Int { get set } var doesNotNeedToBeSettable: Int { get } static var someTypeProperty:Int { get set } } protocol FullNamed { var fullName:String {get} } class Person: FullNamed { var prefix:String? var name:String init(name:String,prefix:String?) { self.prefix = prefix self.name = name } var fullName:String { return (prefix != nil ? prefix! + name : name) } }
protocol FullNamed { var fullName:String {get} mutating func fixname() } struct boy:FullNamed { var prefix:String var name:String var fullName:String { return(prefix + name) } mutating func fixname() { self.name = "123" } } var b = boy(prefix: "China",name: "Barry") print(b.fullName) b.fixname() print(b.fullName)结果:
ChinaBarry
China123
根据上面3,4结论,在协议中定义的方法我要必须全部实现,但这很不合理。在OC的协议中就存在可选方法。
在swift中我们可以定义具有可选的属性和方法,但是这样的协议只能用于class. 定义这样的协议时要在协议的定义前加上@objc
@objc public protocol FullNamed { func beautiful() optional var fullName:String {get} optional func fixname() } class Person:NSObject,FullNamed { var prefix:String? var name:String var age:Int func beautiful() { } init(name:String,prefix:String?) { self.prefix = prefix self.name = name self.age = 2 } }
class Person:FullNamed { var prefix:String? var name:String var age:Int @objc func beautiful() { } init(name:String,prefix:String?) { self.prefix = prefix self.name = name self.age = 2 } }
publicinit?(coder aDecoder:NSCoder)
requiredinit?(coder aDecoder:NSCoder) {
super.init(coder: aDecoder)
}
当我们继承的父类也实现了这个方法是,我们就需要变成requiredoverride
protocol RandomProtocol { func getARandom()->Int } // 用于产生一个随机数,遵守RandomProtocol协议 class CreateNumber:RandomProtocol { func getARandom() -> Int { return random() } } // 返回一个0,遵守RandomProtocol协议 class ResetNumber:RandomProtocol { func getARandom() -> Int { return 0 } } class Person { let name:String! // 协议作为属性的类型 let random:RandomProtocol init(name:String,random:RandomProtocol) { self.name = name self.random = random } func outNumber()->Int { return self.random.getARandom() } } let p = Person(name: "iOS",random:CreateNumber()) print(p.outNumber()) let p1 = Person(name: "iOS",random:ResetNumber()) print(p1.outNumber())
weakpublicvar dataSource:UITableViewDataSource?
weak publicvar delegate:UITableViewDelegate?
当我们的UIViewcontroller加入tableView时,我们只需要让UIViewcontroller遵守UITableViewDelegate和UITableViewDataSourceDelegates就可以作为tableView的代理
tableView.
self.tableView.delegate =self
self.tableView.dataSource =self
protocolSomeClassOnlyProtocol:class, SomeInheritedProtocol {
// class-only protocol definition goes here
}
protocol TextRepresentable { var textualDescription: String{get} } struct Hamster { var name: String var textualDescription: String { return "A hamster named \(name)" } } extension Hamster: TextRepresentable {}在Hamster中起初并未遵守TextRepresentable协议,但是却有一个与协议中属性同名的属性,所以在通过extension遵守属性时就不需要再次实现了。