如何将iOS代码写的更“Swift”一点
程序员文章站
2022-06-08 14:00:51
...
这篇文章记录要将代码写的更像“Swift”的知识点
oc中的协议(protocol)里的函数是有 @optional 和 @required 属性的。但是 Swift 中协议的方法是必须要实现的。有两种方法,一种是把协议转化为 objective-c 的方式,一种是用扩展(extension)。
第一种:
@objc protocol SomeProtocol{
func requiredFunc()
@objc optional func optionalFunc()
}
第二种(我觉得这种更“Swift”一点):
protocol SomeProtocol{
func requiredFunc()
func optionalFunc()
}
extension SomeProtocol{
func optionalFunc(){
print("Dumb Implementation")
}
}
Class SomeClass: SomeProtocol{
func requiredFunc(){
print("Only need to implement the required")
}
}
将 oc 的动态性写的 “Swift”一点。
if([someImage respondsToSelector:@selector(shake)]){
[someImage performSelector:shake];
}
Swift 中可以这样写,用 protocol 来处理:
if let shakeableImage = someImage as? Shakeable{
shakeableImage.shake()
}
oc 中的类包含一个代理属性
@protocol SomeProtocolDelegate <NSObject>
-(void)doSmething;
@end
@interface ViewController
@property(nonatomic,weak) id<SomeProtocolDelegate> delegate;
@end
如果用swift 实现
@objc protocol SomeProtocolDelegate {
func doSmething()
}
public class ViewController: UIViewController {
weak var delegate: SomeProtocolDelegate?
}
或者(我觉得这种更“Swift”一点)
protocol SomeProtocolDelegate : class{
func doSmething()
}
public class ViewController: UIViewController {
weak var delegate: SomeProtocolDelegate?
}
上面三个知识点综合起来运用就是:
oc代码
//.h
//定义方法列表
@protocol SomeProtocolDelegate <NSObject>
@required //强制方法列表
-(void)doSmething;
@optional //可选方法列表
-(void)optionalFunc;
@end
//定义公开属性
@interface ViewController
//实现了SomeProtocolDelegate协议的对象才能有资格成为delegate
@property(nonatomic,weak) id<SomeProtocolDelegate> delegate;
@end
//.m
//在适当的地方调用被代理对象的方法
...
//绑定了doSmething方法的对象,才向它发送消息(即调用方法).
if ([self.delegate respondsToSelector:@selector(doSmething)]) {
[self.delegate performSelector:@selector(doSmething)];
}
Swift 代码
protocol SomeProtocol: class{
func requiredFunc()
func optionalFunc()
}
extension SomeProtocol{
func optionalFunc(){
print("Dumb Implementation")
}
}
class ViewController: UIViewController {
weak var delegate: SomeProtocolDelegate?
}
//.m
//在适当的地方调用被代理对象的方法
if let vc = mVC as? SomeProtocolDelegate{
vc.optionalFunc()
}
推荐阅读