实现iOS协议 - 只读属性

时间:2012-03-12 20:13:13

标签: ios

我有一个来自QuickLook框架的协议:

/*!
 * @abstract The QLPreviewItem protocol declares the methods that a QLPreviewController  instance uses to access the contents of a given item.
 */
@protocol QLPreviewItem <NSObject>

@required

/*!
 * @abstract The URL of the item to preview.
 * @discussion The URL must be a file URL. 
 */
@property(readonly) NSURL * previewItemURL;

@optional

/*!
 * @abstract The item's title this will be used as apparent item title.
 * @discussion The title replaces the default item display name. This property is optional.
 */
@property(readonly) NSString * previewItemTitle;


@end

/*!
 * @abstract This category makes NSURL instances as suitable items for the Preview Controller.
 */
@interface NSURL (QLPreviewConvenienceAdditions) <QLPreviewItem>
@end

我正在尝试为readonly属性previewItemTitle创建getter和setter,这样我就可以添加自定义tile:

·H

#import <Foundation/Foundation.h>
#import <QuickLook/QuickLook.h>

@interface QLPreviewItemCustom : NSObject <QLPreviewItem> {
    NSURL * previewItemURL;
    NSString *previewItemTitle;
}


@property(readonly) NSURL * previewItemURL;
@property (readonly) NSString *previewItemTitle;


@end

的.m

#import "QLPreviewItemCustom.h"


@implementation QLPreviewItemCustom

@synthesize previewItemTitle;
@synthesize previewItemURL;


@end

这样,据我所知,我将使用synthesize方法创建getter。我该如何创建setter?

2 个答案:

答案 0 :(得分:5)

如果您只想在QLPreviewItemCustom的实现中访问setter,那么为什么不将类继续类中的属性扩展为读写:

QLPreviewItemCustom.m

#import "QLPreviewItemCustom.h"

@interface QLPreviewItemCustom ()

@property (readwrite) NSURL *previewItemURL;
@property (readwrite) NSString *previewItemTitle;

@end

@implementation QLPreviewItemCustom

@synthesize previewItemTitle;
@synthesize previewItemURL;

@end

如果你想在任何地方使用setter,那么你将不得不使用不同的ivar名称,并将原始的getter写入你的新名字。像这样:

QLPreviewItemCustom.h

#import <Foundation/Foundation.h>
#import <QuickLook/QuickLook.h>

@interface QLPreviewItemCustom : NSObject <QLPreviewItem> {
    NSURL *url;
    NSString *title;
}


@property (readwrite) NSURL *url;
@property (readwrite) NSString *title;

@end

QLPreviewItemCustom.m

#import "QLPreviewItemCustom.h"

@implementation QLPreviewItemCustom

@synthesize url;
@synthesize title;

- (NSURL*)previewItemURL {
    return self.url;
}

- (NSString*)previewItemTitle {
    return self.title;
}

@end

值得指出的是,自己使用与另一个框架使用的相同类前缀通常不是一个好主意。即不要将其称为QLPreviewItemCustom - 请将其称为ABCPreviewItemCustom

答案 1 :(得分:1)

您可以直接在变量中写入,而不是在属性中。如果您编写self.previewItemURL,您将访问属性,但如果您只编写previewItemURL,您将访问变量,您可以不受任何限制地写入它。

为了获得更多可见性,您可以使用不同的方式命名字段,例如

@interface QLPreviewItemCustom : NSObject <QLPreviewItem> {
    NSURL * _previewItemURL;
    NSString *_previewItemTitle;
}


@property(readonly) NSURL * previewItemURL;
@property (readonly) NSString *previewItemTitle;


@end

和实施:

@implementation QLPreviewItemCustom

@synthesize previewItemTitle = _previewItemTitle;
@synthesize previewItemURL = _previewItemURL;

@end

现在,您可以通过_Nameself.Name

属性直接访问字段