publicとinternal、privateの事。
Swiftを紹介する際、ガードのため、安全のため、という説明をされる事が多い。
あえて物議を醸し出すが、危険な経験があるか。そして、スマートフォンの場合、クラスを作るのも、それを使うのも自分という場合があるが、本当に安全のため?
著者は、privateは、そのクラスのインタフェースを確認する際、無視していいよ程度の意味だと思っている。
なので、Privateとpublicの順で記述している。
class Demo {
public var name;
public func play() {
playGame();
}
private var address;
private func playGame() {
}
}
そう考えると、Objective-Cはよかったじゃん。
@interface Document : NSObject
@property (strong, nonatomic) NSString *version;
+ (Document *)sharedDocument;
- (void)load;
- (void)save;
@end
@interface Document ()
- (void)_clearDefaults;
- (void)_updateDefaults;
- (void)_loadDefaults;
- (NSString*)_modelDir;
- (NSString*)_modelPath;
@end
@implementation Document
@synthesize version = _version;
+ (Document *)sharedDocument;
{
static Document *_sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedInstance = [[Document alloc] init];
});
return _sharedInstance;
}
- (id)init
{
self = [super init];
if (self) {
_version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
}
return self;
}
- (void)dealloc
{
self.version = nil;
}
- (void)load
{
[self _loadDefaults];
NSString *modelPath = [self _modelPath];
if ((! modelPath) || (! [[NSFileManager defaultManager] fileExistsAtPath:modelPath])) {
return;
}
}
- (void)save
{
[self _updateDefaults];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *modelDir = [self _modelDir];
if (![fileManager fileExistsAtPath:modelDir]) {
NSError *error = nil;
[fileManager createDirectoryAtPath:modelDir
withIntermediateDirectories:YES
attributes:nil
error:&error];
}
NSString *modelPath = [self _modelPath];
[NSKeyedArchiver archiveRootObject:self.indexArray toFile:modelPath];
}
- (void)_clearDefaults
{
if ([[NSUserDefaults standardUserDefaults] objectForKey:@"version"]) {
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"version"];
}
}
- (void)_updateDefaults
{
NSString *versionString = nil;
if ([[NSUserDefaults standardUserDefaults] objectForKey:@"version"]) {
versionString = [[NSUserDefaults standardUserDefaults] objectForKey:@"version"];
}
if ((versionString == nil) || ([versionString compare:self.version] != NSOrderedSame)) {
[[NSUserDefaults standardUserDefaults] setObject:self.version forKey:@"version"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
}
- (void)_loadDefaults
{
NSString *versionString = nil;
if ([[NSUserDefaults standardUserDefaults] objectForKey:@"version"]) {
versionString = [[NSUserDefaults standardUserDefaults] objectForKey:@"version"];
}
if ((versionString == nil) || ([versionString compare:self.version] != NSOrderedSame)) {
/* バージョン不一致対応 */
}
else {
/* 読み出し */
}
}
- (NSString*)_modelDir
{
NSArray* paths;
NSString* path;
paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
if ([paths count] < 1) {
return nil;
}
path = [paths objectAtIndex:0];
path = [path stringByAppendingPathComponent:@".model"];
return path;
}
- (NSString*)_modelPath
{
NSString* path;
path = [[self _modelDir] stringByAppendingPathComponent:@"model.dat"];
return path;
}
@end
ソースコード
GitHubからどうぞ。
https://github.com/murakami/workbook/tree/master/ios/Hand - GitHub
関連情報
文化を調和させる
【Cocoa練習帳】
http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)