Foundation framework examples#

This part of the documentation covers examples of using classes from the Foundation framework.

NSArray example#

Here is an example of using the NSArray class:

from pyobjus import autoclass

NSString = autoclass('NSString')
NSArray = autoclass("NSArray")

string_for_array = NSString.alloc().initWithUTF8String_("some text for NSArray")
array = NSArray.arrayWithObject_(string_for_array)

returnedObject = array.objectAtIndex_(0)
value = returnedObject.UTF8String()
contain_object = array.containsObject_(string_for_array)

returnedNSStringObject = array.objectAtIndex_(0)
value = returnedNSStringObject.UTF8String()

print "string value of returned object -->", value
print "return value of containsObject method -->", contain_object

This will output:

>>> string value of returned object --> some text for NSArray
>>> return value of containsObject method --> True

NSArray with pyobjus literals#

If you want, you can use something like an Objective C literal to create an NSArray:

from pyobjus import objc_arr, objc_str

array = objc_arr(objc_str('some string'), objc_str('some other string'))
print array

As you can see here, objc_arr(...) is equivalent to autoclass('NSArray').arrayWithObjects_(...), and will output:

>>> <__main__.__NSArrayI object at 0x10a22d350>

NSDictionary example#

Here is an example of using a NSDictionary class:

from pyobjus import autoclass

NSString = autoclass('NSString')
NSArray = autoclass("NSArray")
NSDictionary = autoclass("NSDictionary")

string_object = NSString.stringWithUTF8String_("some text for NSDictionary")
string_key = NSString.stringWithUTF8String_("someKey")

array_object = NSArray.arrayWithObject_(string_object)
array_key = NSArray.arrayWithObject_(string_key)

# we are passing array with objects and keys
dictionary = NSDictionary.dictionaryWithObjects_forKeys_(array_object, array_key)

returned_nsstring = dictionary.objectForKey_(array_key.objectAtIndex_(0))
str_value = returned_nsstring.UTF8String()
print str_value

This will output:

>>> some text for NSDictionary

NSDictionary with pyobjus literals#

We can also use pyobjus literals with the NSDictionary class.

So let’s add two elements to the dictionary. The first one has the key ‘first_key’ and the value @’string value of first key’, and the second one has the key ‘second_key’ with the value NSArray:

from pyobjus import objc_dict, objc_str, objc_arr

dictionary = objc_dict({
    'first_key': objc_str('string value of first key'),
    'second_key': objc_arr(objc_str('string element of NSArray'))
})

first_key_value = dictionary.objectForKey_(objc_str('first_key'))
second_key_value = dictionary.objectForKey_(objc_str('second_key'))

print first_key_value
print second_key_value

This will output:

>>> <__main__.__NSCFString object at 0x101025d10>
>>> <__main__.__NSArrayI object at 0x101169290>

So, say you want to call the UTF8String method of the NSString object that resides in the ‘first_key’, you can simply call:

str_val = first_key_value.UTF8String()
print 'String value is: {0}'.format(str_val)

This will output:

>>> String value is: string value of first key

NSMutableArray example#

This class is often useful if you need to add elements after you have created an array. So let’s look at an example of using this class with pyobjus:

from pyobjus import autoclass

NSString = autoclass('NSString')
NSMutableArray = autoclass("NSMutableArray")

array = NSMutableArray.arrayWithCapacity_(5)
text_val_one = NSString.alloc().initWithUTF8String_("some text for NSMutableArray")
text_val_two = NSString.alloc().initWithUTF8String_("some other text for NSMutableArray")

# we add some objects to NSMutableArray
array.addObject_(text_val_one)
array.addObject_(text_val_one)
array.addObject_(text_val_two)

count = array.count()
print "count of array before object delete -->", count

# then we remove some of them
array.removeObjectAtIndex_(0)
array.removeObject_(text_val_two)

count = array.count()
print "count of array after object delete -->", count

returnedObject = array.objectAtIndex_(0)
value = returnedObject.UTF8String()
print "string value of returned object -->", value

# call method which accepts multiple arguments
array.insertObject_atIndex_(text_val_two, 1)
returnedObject = array.objectAtIndex_(1)
value = returnedObject.UTF8String()
print "string value of returned object at index 1 -->", value

This will output:

>>> number of array before object delete --> 3
>>> number of array after object delete --> 1
>>> string value of returned object --> some text for NSMutableArray
>>> string value of returned object at index 1 --> some other text for NSMutableArray

NSMutableDictionary example#

As with the class above, you can also add and delete elements from the NSMutableDictionary after you’ve created it.:

from pyobjus import autoclass

NSString = autoclass('NSString')
NSMutableDictionary = autoclass("NSMutableDictionary")

# notice that you can instead of this line use objc_str('some text for NSDictoinary')
string_object = NSString.stringWithUTF8String_("some text for NSDictionary")
string_key = NSString.stringWithUTF8String_("someKey")

string_object_second = NSString.stringWithUTF8String_("some other text for NSDictionary")
string_key_second = NSString.stringWithUTF8String_("someOtherKey")

objects_dict = {
    string_key: string_object,
    string_key_second: string_object_second
}

mutable_dictionary = NSMutableDictionary.dictionaryWithCapacity_(10)

# we can add objects to dict now
for key in objects_dict:
    mutable_dictionary.setObject_forKey_(objects_dict[key], key)

# let's return some object
returned_nsstring = mutable_dictionary.objectForKey_(string_key)

# we can iterate over dict values
enumerator = mutable_dictionary.objectEnumerator()
obj = enumerator.nextObject()
while obj:
    str_value = obj.UTF8String()
    print str_value
    obj = enumerator.nextObject()

So this will output:

>>> some other text for NSDictionary
>>> some text for NSDictionary

Other#

Other examples can be found here.