Reputation: 10744
.h
@property (nonatomic, strong) NSMutableDictionary * products; //not synthesized in .m
.m
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
NSLog(@"Loaded list of products...");
_productsRequest = nil;
NSArray * skProducts = response.products;
for (SKProduct * skProduct in skProducts)
{
IAPProduct * product = _products[skProduct.productIdentifier];
product.skProduct = skProduct;
product.availableForPurchase = YES;
}
for (NSString * invalidProductIdentifier in response.invalidProductIdentifiers)
{
IAPProduct * product = _products[invalidProductIdentifier];
product.availableForPurchase = NO;
NSLog(@"Invalid product identifier, removing: %@", invalidProductIdentifier);
}
NSMutableArray * availableProducts = [NSMutableArray array];
for (IAPProduct * product in _products.allValues) {
if (product.availableForPurchase) {
[availableProducts addObject:product];
}
}
_completionHandler(YES, availableProducts);
_completionHandler = nil;
}
I'm having trouble with the line below:
IAPProduct * product = _products[skProduct.productIdentifier];
I'm thinking we are setting Type IAPProduct *product= NSMutableDictionary[NSArray.productIdentifier];
I thought Array's only have elements (objectAtIndex
)? Why is there a dot (.) and the productIdentifier?
Also
Upvotes: 0
Views: 266
Reputation: 318804
You are having trouble understanding this line:
IAPProduct * product = _products[skProduct.productIdentifier];
Lets break it down:
NSString *key = skProduct.productIdentifier;
IAPProduct * product = _products[key];
The 2nd line is modern syntax for:
IAProduct * product = [_products objectForKey:key];
This is the normal way to lookup a value in a dictionary for a given key.
Upvotes: 1
Reputation: 7720
It's not IAPProduct *product= NSMutableDictionary[NSArray.productIdentifier];
The type of skProduct
is SKProduct
, not NSArray
. The fast enumeration for (SKProduct * skProduct in skProducts)
loops through all elements in skProducts
as SKProduct
.
It's (to some extent) like using a loop with a counter doing:
//for (SKProduct * skProduct in skProducts)
for (int i=0; i<skProducts.count; i++)
{
SKProduct *skProduct = skProduct[i];
IAPProduct * product = _products[skProduct.productIdentifier];
product.skProduct = skProduct;
product.availableForPurchase = YES;
}
Upvotes: 1