2016-01-18 43 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; 
} 
}