iOS 中的代理模式 - Swift
Proxy Pattern in iOS - Swift
我需要使用 swift
在 iOS 中创建代理模式
我已经用 Objective C 试过了,这是代码
MyProtocol.h
#import <Foundation/Foundation.h>
@protocol MyProtocol <NSObject>
@required
-(void)testMessage;
@end
TestBO.h
#import <Foundation/Foundation.h>
#import "MyProtocol.h"
@interface TestBO : NSObject <MyProtocol>
@end
TestBO.m
#import "TestBO.h"
@implementation TestBO
-(void)testMessage{
NSLog(@"Test Message");
}
@end
TestProxyHandler.h
#import <Foundation/Foundation.h>
@interface TestProxyHandler : NSProxy
@property (nonatomic, strong) id object;
- (instancetype)initWithProtocol:(Protocol *)protocol andObject:(Class)clazz;
- (void)forwardInvocation:(NSInvocation *)invocation;
- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector;
@end
TestProxyHandler.m
#import "TestProxyHandler.h"
#import "TestBO.h"
@implementation TestProxyHandler
- (instancetype)initWithProtocol:(Protocol *)protocol andObject:(Class)clazz{
if ([clazz conformsToProtocol:@protocol(MyProtocol)]) {
self.object = [[clazz alloc] init];
}else{
NSLog(@"Error it does not conform to protocol");
}
return self;
}
- (void)forwardInvocation:(NSInvocation *)invocation{
NSString *selString = NSStringFromSelector(invocation.selector);
NSLog(@"Called %@",selString);
[invocation invokeWithTarget:self.object];
}
- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector {
return [self.object methodSignatureForSelector:selector];
}
@end
我使用
调用了它
id <MyProtocol> delegate = (TestBO *)[[TestProxyHandler alloc] initWithProtocol:@protocol(MyProtocol) andObject:[TestBO class]];
[delegate testMessage];
但我无法使它在 Swift 中工作,即使 initialzier 显示消息
TestHandler.swift
import Foundation
class TestHandler: NSProxy {
var object: AnyObject
convenience override init(`protocol`: Protocol, andObject clazz: AnyClass) {
if clazz.conformsToProtocol() {
self.object = clazz()
}
else {
NSLog("Error it does not conform to protocol")
}
}
}
在 swift 中有人有任何线索吗??
编辑:
在 java 中,您可以使用 Proxy.newProxyInstance 调用创建方法的运行时实现,但这可以在 iOS 中实现吗?使用 swift ?有什么线索吗?
与 Objective C 和 Swift 相比,Swift 提供了极其有限的运行时语言访问权限。所以根据我的研究到现在还不能完成:(
我什至尝试在 swift 中子 classing NSProxy class 但就是无法调用 super.init 并且代码永远不会编译,但是同样的事情在 objective C
中有效
所以我最终采用了这种方法
我使用
创建了一个协议
@objc protocol SomeProt {
// Some method
}
注意关键字 @objc 之前的协议是必不可少的,否则你将无法将它作为变量传递,同时添加 @objc 将协议的使用限制为 objective c 运行时功能,因此不要期望在 swift
中获得协议的全部功能
public func someMethod(`protocol` : Protocol, implementation : AnyClass) {
let isImplemented : Bool = implementation.conformsToProtocol(`protocol`)
// some code
}
如果你需要在某些字典或需要符合NSCopying class 的地方使用它,那么使用
NSStringFromProtocol
和
NSProtocolFromString
方法
现在我写了一个 objective c 助手 class 来做初始化
ObjcHelper.h
#import <Foundation/Foundation.h>
@interface ObjcHelper : NSObject
+(NSObject *)objectForClass:(Class)clazz;
@end
ObjcHelper.m
#import "ObjcHelper.h"
@implementation ObjcHelper
+ (NSObject *)objectForClass:(Class)clazz{
return [[clazz alloc] init];
}
@end
现在开始使用它
let prot : SomeProt = ObjcHelper.objectForClass(NSClassFromString("PROT_HANDLER_CLASS_NAME")) as! SomeProt
不过以后如果有人能提供更好的答案,请务必post在这里
我需要使用 swift
在 iOS 中创建代理模式我已经用 Objective C 试过了,这是代码
MyProtocol.h
#import <Foundation/Foundation.h>
@protocol MyProtocol <NSObject>
@required
-(void)testMessage;
@end
TestBO.h
#import <Foundation/Foundation.h>
#import "MyProtocol.h"
@interface TestBO : NSObject <MyProtocol>
@end
TestBO.m
#import "TestBO.h"
@implementation TestBO
-(void)testMessage{
NSLog(@"Test Message");
}
@end
TestProxyHandler.h
#import <Foundation/Foundation.h>
@interface TestProxyHandler : NSProxy
@property (nonatomic, strong) id object;
- (instancetype)initWithProtocol:(Protocol *)protocol andObject:(Class)clazz;
- (void)forwardInvocation:(NSInvocation *)invocation;
- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector;
@end
TestProxyHandler.m
#import "TestProxyHandler.h"
#import "TestBO.h"
@implementation TestProxyHandler
- (instancetype)initWithProtocol:(Protocol *)protocol andObject:(Class)clazz{
if ([clazz conformsToProtocol:@protocol(MyProtocol)]) {
self.object = [[clazz alloc] init];
}else{
NSLog(@"Error it does not conform to protocol");
}
return self;
}
- (void)forwardInvocation:(NSInvocation *)invocation{
NSString *selString = NSStringFromSelector(invocation.selector);
NSLog(@"Called %@",selString);
[invocation invokeWithTarget:self.object];
}
- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector {
return [self.object methodSignatureForSelector:selector];
}
@end
我使用
调用了它id <MyProtocol> delegate = (TestBO *)[[TestProxyHandler alloc] initWithProtocol:@protocol(MyProtocol) andObject:[TestBO class]];
[delegate testMessage];
但我无法使它在 Swift 中工作,即使 initialzier 显示消息
TestHandler.swift
import Foundation
class TestHandler: NSProxy {
var object: AnyObject
convenience override init(`protocol`: Protocol, andObject clazz: AnyClass) {
if clazz.conformsToProtocol() {
self.object = clazz()
}
else {
NSLog("Error it does not conform to protocol")
}
}
}
在 swift 中有人有任何线索吗??
编辑:
在 java 中,您可以使用 Proxy.newProxyInstance 调用创建方法的运行时实现,但这可以在 iOS 中实现吗?使用 swift ?有什么线索吗?
与 Objective C 和 Swift 相比,Swift 提供了极其有限的运行时语言访问权限。所以根据我的研究到现在还不能完成:(
我什至尝试在 swift 中子 classing NSProxy class 但就是无法调用 super.init 并且代码永远不会编译,但是同样的事情在 objective C
中有效所以我最终采用了这种方法
我使用
创建了一个协议@objc protocol SomeProt {
// Some method
}
注意关键字 @objc 之前的协议是必不可少的,否则你将无法将它作为变量传递,同时添加 @objc 将协议的使用限制为 objective c 运行时功能,因此不要期望在 swift
中获得协议的全部功能public func someMethod(`protocol` : Protocol, implementation : AnyClass) {
let isImplemented : Bool = implementation.conformsToProtocol(`protocol`)
// some code
}
如果你需要在某些字典或需要符合NSCopying class 的地方使用它,那么使用
NSStringFromProtocol
和
NSProtocolFromString
方法
现在我写了一个 objective c 助手 class 来做初始化
ObjcHelper.h
#import <Foundation/Foundation.h>
@interface ObjcHelper : NSObject
+(NSObject *)objectForClass:(Class)clazz;
@end
ObjcHelper.m
#import "ObjcHelper.h"
@implementation ObjcHelper
+ (NSObject *)objectForClass:(Class)clazz{
return [[clazz alloc] init];
}
@end
现在开始使用它
let prot : SomeProt = ObjcHelper.objectForClass(NSClassFromString("PROT_HANDLER_CLASS_NAME")) as! SomeProt
不过以后如果有人能提供更好的答案,请务必post在这里