From Ruby to Objective-C

F2dcf6633971844e19ca96ea294ba976?s=47 高見龍
November 27, 2013

From Ruby to Objective-C

because Ruby and Objective-C has the same ancestor, they have many things in common, and in this talk I mainly talk about what I learned in Ruby, borrow those experiences and move to Objective-C :)

Ruby Tuesday #27 @Taiwan

F2dcf6633971844e19ca96ea294ba976?s=128

高見龍

November 27, 2013
Tweet

Transcript

  1. 1.
  2. 3.
  3. 4.

    I’m a Ruby guy (≈ 5 years) I’m a iOS

    app guy (≈ 3 years) I’m a Flash guy (≈ 9 years) I’m a Python guy (≈ 3 years)
  4. 16.
  5. 18.

    “it has god dame long method name and weird parameters!”

    Objective-C … NSArray* languages = [NSArray arrayWithObjects:@"Ruby", @"PHP", @"Objective-C", nil]; ! [languages enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { NSLog(@"language = %@", obj); }];
  6. 19.

    “what the hell is the square bracket!” Objective-C … NSString*

    myName = @"eddie kao"; NSLog(@"%@", [myName uppercaseString]);
  7. 32.

    Type checking.. - (void) makeSomeNoise:(id) sender { if ([sender isKindOfClass:[RobberDuck

    class]]) { RobberDuck* duck = (RobberDuck *) sender; [duck quack]; } }
  8. 33.

    or you can do this.. - (void) makeSomeNoise:(id) sender {

    if ([sender respondsToSelector:@selector(quack)]) { [sender quack]; } }
  9. 34.
  10. 35.

    id

  11. 39.
  12. 40.

    CF… = Core Foundation CG… = Core Graphic CL… =

    Core Location CA… = Core Animation UI… = User Interface
  13. 41.

    OOP

  14. 46.

    object model dog = Dog.new ! puts "class of dog

    is #{dog.class}” # Dog puts "superclass of dog is #{dog.class.superclass}” # Animal puts "super superclass of dog is #{dog.class.superclass.superclass}” # Object puts "super super superclass of dog is #{dog.class.superclass.superclass.superclass}” # BasicObject ! puts "class of Dog is #{Dog.class}” # Class puts "class class of Dog is #{Dog.class.class}” # Class puts "class of Animal is #{Animal.class}” # Class puts "class of Object is #{Object.class}” # Class
  15. 47.

    object model @interface Animal : NSObject @end ! @implementation Animal

    @end ! @interface Dog : Animal @end ! @implementation Dog @end
  16. 48.

    object model Dog* dog = [[Dog alloc] init]; ! NSLog(@"class

    of dog is %@", [dog class]); # Dog ! NSLog(@"superclass of dog is %@", [dog superclass]); # Animal ! NSLog(@"super superclass of dog is %@", [[dog superclass] superclass]); # NSObject ! NSLog(@"super super superclass of dog is %@", [[[dog superclass] superclass] superclass]); # null
  17. 51.

    method definition - (void) sayHello:(id)someOne withMessage:(NSString *)message { NSLog(@"Hello %@,

    %@", someOne, message); } def say_hello(someone, message) puts "Hello #{someone}, #{message}" end
  18. 55.

    sending message class Bank def save(money) puts "you just saved

    #{money} dollars" end end ! bank = Bank.new bank.save 20 # you just saved 20 dollars bank.send(:save, 20) # you just saved 20 dollars
  19. 56.

    sending message @interface Bank : NSObject - (void) save:(NSNumber *)

    money; @end ! @implementation Bank - (void)save:(NSNumber *)money { NSLog(@"you just saved %@ dollars", money); } @end ! Bank* bank = [[Bank alloc] init]; [bank save:@20]; [bank performSelector:@selector(save:) withObject:@20];
  20. 57.
  21. 58.

    block p1 = Proc.new { puts "Hello, Proc Block" }

    p1.call ! p2 = lambda { puts "Hello, Lambda Block" } p2.call
  22. 60.

    block typedef void (^MyBlock)(void); int age = 18; MyBlock theBlock

    = ^{ NSLog(@"Hello, Objective-C Block, your age = %d", age); }; ! theBlock(); # Hello, Objective-C Block, your age = 18 ! age = 38; theBlock(); # guess what’s the age?
  23. 61.

    block 3.times { |i| puts i } NSArray* list =

    @[@1, @2, @3]; [list enumerateObjectsUsingBlock:^(NSNumber* num, NSUInteger idx, BOOL *stop) { NSLog(@"%@", num); }];
  24. 62.
  25. 63.

    iteration list = [1, 2, 3, 4, 5] ! sum

    = 0 ! list.each { |num| sum += num } ! puts "sum = #{sum}"
  26. 64.

    iteration NSArray* list = @[@1, @2, @3, @4, @5]; !

    __block int sum = 0; ! [list enumerateObjectsUsingBlock:^(NSNumber* num, NSUInteger idx, BOOL *stop) { sum += [num intValue]; }]; ! NSLog(@"sum = %d", sum);
  27. 65.

    iteration class Fox def say puts "what does the fox

    say?" end end ! fox1 = Fox.new fox2 = Fox.new fox3 = Fox.new foxes = [fox1, fox2, fox3] ! foxes.map { |fox| fox.say } # what does the fox say?
  28. 66.

    iteration @interface Fox : NSObject - (void) say; @end !

    @implementation Fox - (void) say { NSLog(@"what does the fox say?!"); } @end
  29. 67.

    iteration Fox* fox1 = [[Fox alloc] init]; Fox* fox2 =

    [[Fox alloc] init]; Fox* fox3 = [[Fox alloc] init]; ! NSArray* foxes = @[fox1, fox2, fox3]; ! [foxes makeObjectsPerformSelector:@selector(say)];
  30. 69.

    Open class class String def is_awesome? return true if self

    == "Ruby Tuesday" end end ! puts "Ruby Tuesday".is_awesome?
  31. 70.

    Category @interface NSString(RubyTuesday) - (BOOL) isAwesome; @end ! @implementation NSString(RubyTuesday)

    - (BOOL) isAwesome { if ([self isEqualToString:@"Ruby Tuesday"]){ return YES; } return NO; } @end
  32. 72.

    <objc/runtime.h> Working with Classes class_getName class_getSuperclass class_getInstanceVariable class_getClassVariable class_addIvar class_copyIvarList

    class_addMethod class_getInstanceMethod class_getClassMethod class_replaceMethod class_respondsToSelector .. reference: http://goo.gl/BEikIM
  33. 73.

    Working with Instances object_copy object_dispose object_setInstanceVariable object_getInstanceVariable object_getIndexedIvars object_getIvar object_setIvar

    object_getClassName object_getClass object_setClass .. reference: http://goo.gl/BEikIM <objc/runtime.h>
  34. 74.

    reflection - (BOOL) isKindOfClass:(Class) aClass - (BOOL) isMemberOfClass:(Class) aClass -

    (BOOL) respondsToSelector:(SEL) aSelector - (BOOL) conformsToProtocol:(Protocol *) aProtocol .. reference: http://goo.gl/fgmJcg
  35. 75.
  36. 77.

    Ruby : bundler source 'https://rubygems.org' ! gem 'rails', '3.2.8' gem

    'mysql2' ! group :assets do gem 'sass-rails', '~> 3.2.3' gem "bootstrap-sass" end ! gem "kaminari" gem "simple_form" gem "carrierwave" gem 'unicorn'
  37. 78.

    Objective-C : cocoapods platform :ios, '6.0' ! pod 'Facebook-iOS-SDK', '~>

    3.5.1’ pod 'JSONKit', '~> 1.5pre' pod 'MagicalRecord', '~> 2.0.7’ pod 'SSKeychain', '~> 0.1.4’ pod 'TestFlightSDK', '~> 1.1' pod 'SMCalloutView', '~> 1.1.2' ! target :UnitTests do link_with 'UnitTests' pod 'OCMock', '~> 2.0.1' pod 'OCHamcrest', '~> 1.9' end
  38. 79.
  39. 85.

    C

  40. 88.
  41. 95.

    ⾼高⾒見⻯⿓龍 Contacts photo by Eddie Website Blog Plurk Facebook Google

    Plus Twitter Email Mobile http://www.eddie.com.tw http://blog.eddie.com.tw http://www.plurk.com/aquarianboy http://www.facebook.com/eddiekao http://www.eddie.com.tw/+ https://twitter.com/#!/eddiekao eddie@digik.com.tw +886-928-617-687