在 iOS-代理模式Swift

标签: Swift2 ios Swift
发布时间: 2017/3/5 22:26:24
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我需要在 iOS 使用创建代理模式swift

我已经尝试过使用目标 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 吗?任何的线索吗?

解决方法 1:

与目标 C 相比, SwiftSwift 提供极其有限的运行时语言访问访问。因此,基于我的研究直到现在它不能做:(

我甚至试过子类中的NSProxyswift ,但只是不能调用super.init和从来没有代码编译但同样的事情在目标 C 的工作然而

所以我干了这种方法

我创建了Protocol使用

@objc protocol SomeProt {
    // Some method
}

注意关键字@objcProtocol之前是必不可少,否则你不会能够将其作为变量传递也添加@objc限制议定书目标 c 运行时功能的用法,所以别指望能Protocol中的全部功能swift

public func someMethod(`protocol` : Protocol, implementation : AnyClass) {
    let isImplemented : Bool = implementation.conformsToProtocol(`protocol`)
        // some code
}

如果你需要使用一些字典或在哪里它应该符合NSCopying类的地方然后使用

NSStringFromProtocol

NSProtocolFromString

方法

现在我已写了一个客观的 c 帮助器类来执行初始化

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

但是在将来如果有人可以提供更好的答案然后请一定要在这里邮寄它

官方微信
官方QQ群
31647020