protocol SomeProtocol { // protocol deFinition goes here}
2. 语法 当自定义的类型需要遵守一个或多个协议时,结构如下:
class CustomType:SuperClass,Protocol1,Protocol2 {
}
3. 属性要求 在协议中添属性时, 属性必须是变量,而且必须指定其读写属性,不必关心其是计算属性还是存储属性, 如果是类属性只要在前面加上 "static"
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) } }
在一般情况下我们需要在遵守协议的自定义类型中实现所有的属性 4方法要求
跟OC一样,只需要在自定义的类型中实现协议中的方法即可。
注意: 当协议用于struct,enumeration时,如果协议中的实列方法需要改变该实例的属性时,需要在方法前面加上mutating关键字。
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 } }
上面的代码中 person继承于NSObject,但是如果Person没有继承于NSObject及其子类,那么就要在实现的方法前面加是@objc
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)
@R_301_4173@init?(coder aDecoder:NSCoder) {
super.init(coder: aDecoder)
}
当我们继承的父类也实现了这个方法是,我们就需要变成@R_301_4173@overrIDe
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())
在类Person中有一个 RandomProtocol类型的属性,任何遵守RandomProtocol协议的类的实例都可以作为RandomProtocol类型的实例。就像上面代码表现的一样,CreateNumber()和resetNumber()都可以作为RandomProtocol类型的实例
8. 代理 遵守某个协议的类可以作为代理出现,只要用过tableVIEw对这个再熟悉不过了。在tableVIEw中有这样两个属性
weakpublicvar dataSource:UItableVIEwDataSource?
weak publicvar delegate:UItableVIEwDelegate?
当我们的UIVIEwcontroller加入tableVIEw时,我们只需要让UIVIEwcontroller遵守UItableVIEwDelegate和UItableVIEwDataSourceDelegates就可以作为tableVIEw的代理
tableVIEw.
self.tableVIEw.delegate =self
self.tableVIEw.dataSource =self
@H_960_419@protocolSomeClassOnlyProtocol:@H_960_419@class, SomeinheritedProtocol {
// class-only protocol deFinition goes here
}
@H_179_404@ protocol 可以像普通类一样继承并且支持多继承 可以通过extension关键字让已存在的类遵守某个协议extension Classname: protoclname。 当通过extension添加协议时,如果类中已经存在与协议中同名的方法时,extension协议的实现中可以不写这些方法。
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遵守属性时就不需要再次实现了。 总结
以上是内存溢出为你收集整理的swift protocol全部内容,希望文章能够帮你解决swift protocol所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)