Cocoa API解説(macOS/iOS)

iOS , Mac アプリケーション開発のために使われる主要フレームワークの日本語情報です。

目次

NSValueクラス

INDEX>Foundation>

apple(OS X)
apple(iOS)

解説

継承 NSObject
準拠 NSObject (NSObject)
フレームワーク /System/Library/Frameworks/Foundation.framework
使用可能 Mac OS X 10.0以降
iOS 2.0以降

OS X

定義 NSGeometry.h
NSRange.h
NSValue.h

iOS

定義 NSRange.h
NSValue.h

概要

NSPoint、NSRange、構造体などをオブジェクトとして扱うためのクラスです。intやfloatなどはNSValueのサブクラスであるNSNumberで扱います。
NSArrayNSSetNSDictionaryで扱う要素はオブジェクトである必要があり、数値や構造体などはオブジェクトではないのでNSValueやNSNumberでカプセル化してからNSArrayNSSetNSDictionaryの要素とするのです。

NSValueオブジェクトは常に変更不可です。

NSValueオブジェクトの作成

NSRangeからNSValueを作成するには(+ valueWithRange:)メソッドを使用します。

NSRangeから作成

#pragma mark NSValue valueWithRange
-(void)method003
{
    NSMutableDictionary *aDictionary = [NSMutableDictionary dictionaryWithCapacity:3];
    
    [aDictionary setValue:@"ddd" forKey:@"stringKey"];
    
    NSRange aRange = NSMakeRange(0, 10);
    [aDictionary setObject:[NSValue valueWithRange:aRange] forKey:@"rangeKey"];
    
    
    NSLog(@"%s %p %@",__FUNCTION__,aDictionary,[aDictionary valueForKey:@"@allValues"]);
    //=>-[OOOAppDelegate method003] 0x6a2ac10 (ddd,"NSRange: {0, 10}")
}

Objective-Cタイプと値からNSValueオブジェクトを作成するには(+ value:withObjCType:)メソッドを使用します。

CGPointからNSValueオブジェクトを作成

#pragma mark NSValue @encode(CGPoint)
-(void)method004
{
    NSMutableDictionary *aDictionary = [NSMutableDictionary dictionaryWithCapacity:10];
    
    [aDictionary setValue:@"ddd" forKey:@"stringKey"];
    
    CGPoint aPoint = CGPointMake(0, 200);
    
    [aDictionary setObject:[NSValue value:&aPoint withObjCType:@encode(CGPoint)] forKey:@"objcKey"];
    
    NSLog(@"%s %p %@",__FUNCTION__,aDictionary,[aDictionary valueForKey:@"@allValues"]);
    //=>-[OOOAppDelegate method001] 0x6a2ac10 (ddd,"NSPoint: {0, 200}")
    
}

CポインタからNSValueを作成するには(+ valueWithBytes:objCType:)メソッドを使用します。allocで作成した後CポインタからNSValueを初期化するには(– initWithBytes:objCType:)メソッドを使用します。

#pragma mark NSValue objCType
-(void)method007
{
    NSMutableDictionary *aDictionary = [NSMutableDictionary dictionaryWithCapacity:10];
    
    char *cString = "My name is OOMORI.";
    NSValue *aValue = [NSValue valueWithBytes:cString objCType:@encode(char *) ];
                       
    [aDictionary setObject:aValue forKey:@"objcKey"];
    
    NSLog(@"%s %s",__FUNCTION__,[aValue objCType]);
    NSLog(@"%s %@",__FUNCTION__,[aDictionary description]);
    //=>-[OOOAppDelegate method001] 0x6a2ac10 (ddd,"NSPoint: {0, 200}")
    NSLog(@"%s %p %@",__FUNCTION__,aDictionary,[aDictionary valueForKey:@"objcKey"]);
}

オブジェクトからNSValueを作成するには(+ valueWithNonretainedObject:)メソッドを作成します。

ポインタ値からNSValueを作成するには(+ valueWithPointer:)メソッドを使います。

#pragma mark NSValue valueWithPointer
-(void)method009
{
    NSMutableDictionary *aDictionary = [NSMutableDictionary dictionaryWithCapacity:10];
    
    char *localString = "My name is OOMORI.";
	NSValue *theValue = [NSValue valueWithPointer: localString ];
	[aDictionary setObject:theValue forKey:@"objcKey"];
    
    char *theCString;
    theCString = [[aDictionary valueForKey:@"objcKey"] pointerValue];
    
	NSLog(@"%s %s",__FUNCTION__,theCString);
    
    NSLog(@"%s %s",__FUNCTION__,[theValue objCType]);
}

データへのアクセス

ポインタ値を取得するには(– pointerValue)メソッドを使用します。オブジェクトを取得するには(– nonretainedObjectValue)メソッドを使用します。NSRange値を取得するには(– rangeValue)メソッドを使用します。レシーバのObjective-Cタイプを取得するには(– objCType)メソッドを使用します。
レシーバの値を与えられたポインタ値にコピーするには(– getValue:)メソッドを使用します。

構造体をNSValueに

#pragma mark NSValue @encode(myStruct)
typedef struct {	
    NSUInteger point;
    NSUInteger length;
} MYStruct;
-(void)method002
{
    NSMutableDictionary *aDictionary = [NSMutableDictionary dictionaryWithCapacity:10];
    
    [aDictionary setValue:@"ddd" forKey:@"key4"];
    
    NSRange aRange = NSMakeRange(0, 10);
    [aDictionary setObject:[NSValue valueWithRange:aRange] forKey:@"keyNSRange"];
    
    MYStruct myStruct;
    myStruct.point = 0;
    myStruct.length = 10;
    
    
    [aDictionary setObject:[NSValue value:&myStruct withObjCType:@encode(MYStruct)] forKey:@"keyMYStruct"];
    
    NSLog(@"%s %p %@",__FUNCTION__,aDictionary,[aDictionary valueForKey:@"@allValues"]);
    
    NSValue *structValue = [aDictionary objectForKey:@"keyMYStruct"];
    MYStruct myStruct2;
	
    [structValue getValue:&myStruct2];
    
    NSLog(@"%s %p %d",__FUNCTION__,aDictionary,myStruct2.length);
    //=>10
    
}

オブジェクトの比較

レシーバと他のオブジェクトが同じかどうかを調べるには(– isEqualToValue:)メソッドを使います。

NSValueの比較

#pragma mark NSValue isEqualToValue
-(void)method010
{
    CGPoint aPoint = CGPointMake(0, 200);
    NSValue *aValue = [NSValue value:&aPoint withObjCType:@encode(CGPoint)];

    CGPoint bPoint = CGPointMake(0, 200);
    NSValue *bValue = [NSValue value:&bPoint withObjCType:@encode(CGPoint)];
    
    CGPoint cPoint = CGPointMake(200, 200);
    NSValue *cValue = [NSValue value:&cPoint withObjCType:@encode(CGPoint)];

    NSLog(@"a vs b %@",([aValue isEqualToValue:bValue]?@"YES":@"NO"));
    NSLog(@"a vs c %@",([aValue isEqualToValue:cValue]?@"YES":@"NO"));

}

適合するプロトコル