2016-01-18 46 views
0

我有一个抽象类AuthResult有财产 - Token模型类。如何覆盖拥有自己属性的属性对象的setter方法?

#import <Foundation/Foundation.h> 

@class Token; 

@interface AuthResult : NSObject 

+ (instancetype)sharedInstance; // designated initializer 

@property (readwrite, strong, nonatomic) Token *token; 
@property (readwrite, nonatomic) BOOL isAuthorized; 

@end 

Token模型类,在轮到他,有在5个属性:

#import <Foundation/Foundation.h> 

@interface Token : NSObject 

@property (readwrite, strong, nonatomic) NSString *accessToken; 
@property (readwrite, strong, nonatomic) NSDate *expirationDate; 
@property (readwrite, strong, nonatomic) NSString *tokenType; 
@property (readwrite, strong, nonatomic) NSString *scope; 
@property (readwrite, strong, nonatomic) NSString *refreshToken; 

@end 

我的目标是覆盖setter方法在AuthResult类,以处理不同的情况。例如。在令牌刷新请求后,它具有refreshToken属性,因此我不需要清除它。

我试过这个方法 - 二传手在AuthResult类:

- (void)setToken:(Token *)token { 
    _token.accessToken = token.accessToken; 
    _token.expirationDate = token.expirationDate; 
    _token.tokenType = token.tokenType; 
    _token.scope = token.scope; 

    if (token.refreshToken != nil) { 
     // DO NOT OVERRIDE REFRESH_TOKEN HERE (after refresh token request it comes as null) 
     _token.refreshToken = token.refreshToken; 
    } 
} 

但它不工作。它使AuthResult类中的令牌对象始终为空。

正如我所见 - 我没有访问对象属性。我可以访问实例变量 - “_token”对象。但我无法访问HIS属性。

请指教。谢谢

+0

我想你应该在分配值之前检查'_token == nil'并在需要时创建它? – Lucho

回答

1

但它不工作。它使AuthResult类中的标记对象始终为空。

你的财产token引用类型和这种是nil默认值。

在您提供的代码中,您从未将任何值分配给token本身。例如以下语句:

_token.accessToken = token.accessToken; 

是分配一个值由值在_token引用的对象accessToken的指令 - 但作为_token值永远不会被你从nil发生变化,因此没有引用对象来改变属性。由于Objective-C的规则,你不会在这里得到一些错误,而有些语言会给出这个错误,这个行为根本就什么也不做。

问题是你真的想做什么?

如果,而我在你这里的意图猜测,你AuthResult对象应该有自己的Token对象,其性质应该由你的二传手修改,那么你就要成功了,你只需要分配Token物品为您的AuthResult拥有。你可以用类似的代码做到这一点:

- (void)setToken:(Token *)token 
{ 
    if(_token == nil) 
     _token = Token.new; // don't have a token yet, allocate one 
    // now update the fields of our _token from token 
    _token.accessToken = token.accessToken; 
    _token.expirationDate = token.expirationDate; 
    ... 

虽然能解决您的眼前的问题不解决大设计问题,应该怎么做呢?_token中的值可以被getter读取,因为它是一个引用,这意味着它的属性可以被使用getter的人改变,然后设置它们。如果_token的对象引用属于您的AuthResult实例,可能不是您想要的实例,例如,您可能希望获取方返回副本

所以想想你的模型。

HTH

+0

非常感谢您的回答。我明天在工作 –

+0

,如果我理解正确,我应该使用这个结构来返回我的令牌对象的副本在getter? - 'return [_token copy];' –

+0

@BogdanLaukhin - 是的,*如果*你想返回一个副本,你可以这样做(当然,'Token'实现'NSCopying')。 – CRD

0

您忘记了初始化令牌对象。 你可以这样说:

- (void)setToken:(Token *)token { 
_token = [Token new]; //initialize Token Object 
_token.accessToken = token.accessToken; 
_token.expirationDate = token.expirationDate; 
_token.tokenType = token.tokenType; 
_token.scope = token.scope; 

if (token.refreshToken != nil) { 
    // DO NOT OVERRIDE REFRESH_TOKEN HERE (after refresh token request it comes as null) 
    _token.refreshToken = token.refreshToken; 
} 
}