LINE占い iOS アプリ開発の現状 / LINE DM 15 about a LINE Fortune development

LINE占い iOS アプリ開発の現状 / LINE DM 15 about a LINE Fortune development

This talk at LINE Developer Meetup in Fukuoka #15

A14115ef29d28344bb198f8596dd8d0c?s=128

H.Takeshita

July 29, 2016
Tweet

Transcript

  1. -*/&઎͍J04ΞϓϦ ։ൃͷݱঢ় -*/&'VLVPLB!UBLFUJO -*/&%FWFMPQFS.FFUVQJO'VLVPLB

  2. ࣗݾ঺հ w !UBLFUJO w ೥ੜ·Ε w ݩ؟ڸ԰ w J04։ൃྺ೥

  3. ΞδΣϯμ w -*/&઎͍ʹ͍ͭͯ w αʔϏε։ൃϑϩʔ w ࠷ۙͷ։ൃํ਑ w ࣾ಺ศརXFCαʔϏε

  4. -*/&઎͍ʹ͍ͭͯ

  5. -*/&઎͍ w -*/&಺ αʔϏεͱͯ͠ϦϦʔε w ୯ಠΞϓϦ ͱͯ͠ϦϦʔε

  6. -*/&઎͍ • ܳೳքͰ࿩୊ͷεϐϦνϡ Ξϧঁࢠେੜ$)*&ɺήο λʔζ൧ాͳͲͷ઎͍ࢣʹ ΑΔʮຊ֨઎͍ʯ • 100໊Ҏ্ͷਓؾ઎͍ࢣͷ த͔Βࣗ෼ͷ೰Έʹ߹ͬ ͨ۩ମతͳΞυόΠεͱ

    ؑఆΛड͚Δ͜ͱ͕Ͱ͖ Δʮ೰Έ૬ஊॴʯ
  7. -*/&઎͍ w ରԠ04J04Ҏ্

  8. None
  9. ݄ ݄ ݄ ݄ ݄ ϦϦʔε 7FSTJPO -*/&઎͍ ։ൃ෱ԬҠ؅ J04DVU

    7FSTJPO ݄ -*/&'VLVPLB ։ൃ্ཱࣨͪ͛   
  10. αʔϏε։ൃϑϩʔ

  11. اը σβΠφ ΤϯδχΞ 2" 5& 5&

  12. اը σβΠφ ΤϯδχΞ 2" 5& 5& ౦ژ ෱Ԭ

  13. اը σβΠφ ΤϯδχΞ 2" 5& 5&

  14. اը σβΠφ ΤϯδχΞ 2" 5& 5& ΞΠσΞͩΑ

  15. اը σβΠφ ΤϯδχΞ 2" 5& 5& ;Ή;ΉɺͰ͖ͦ͏ ΞΠσΞͩΑ

  16. اը σβΠφ ΤϯδχΞ 2" 5& 5& ΋ͬͱ͜͏͢Ε͹Α͘Ͷʁ ΞΠσΞͩΑ

  17. اը σβΠφ ΤϯδχΞ 2" 5& 5& ΋ͬͱ͜͏͢Ε͹Α͘Ͷʁ ͋ʔɺͳΔ΄ͲɻΠΠωɻ

  18. اը σβΠφ ΤϯδχΞ 2" 5& 5& ͜͏͍͏ࣄ͠Α͏ͱࢥͬͯΔ

  19. اը σβΠφ ΤϯδχΞ 2" 5& 5& ͜͏͍͏ࣄ͠Α͏ͱࢥͬͯΔ ϞοΫ࡞Γ·͢Ͷ

  20. اը σβΠφ ΤϯδχΞ 2" 5& 5& ϞοΫ࡞ͬͨΑɻ ͜Μͳಈ͖ͯ͠Ͷɻ

  21. اը σβΠφ ΤϯδχΞ 2" 5& 5& ͪΐɺݫ͘͠Ͷʁ ϞοΫ࡞ͬͨΑɻ ͜Μͳಈ͖ͯ͠Ͷɻ

  22. اը σβΠφ ΤϯδχΞ 2" 5& 5& ͜Μͳײ͡ͰͲ͏ʁ ϞοΫ࡞ͬͨΑɻ ͜Μͳಈ͖ͯ͠Ͷɻ

  23. اը σβΠφ ΤϯδχΞ 2" 5& 5& ͜Μͳײ͡ͰͲ͏ʁ Φοέʔɺ͡ΌΨΠυ࡞ΔͶ

  24. اը σβΠφ ΤϯδχΞ 2" 5& 5& ΨΠυ࡞ͬͨΑ

  25. اը σβΠφ ΤϯδχΞ 2" 5& 5& ΨΠυ࡞ͬͨΑ

  26. اը σβΠφ ΤϯδχΞ 2" 5& 5& Αͬ͠Όɺ։ൃ͢ΔͰ ΨΠυ࡞ͬͨΑ

  27. اը σβΠφ ΤϯδχΞ 2" 5& 5& Αͬ͠Όɺ։ൃ͢ΔͰ ΨΠυ࡞ͬͨΑ Μ͡Όςετέʔε࡞͓ͬͯ ͖·͢

  28. اը σβΠφ ΤϯδχΞ 2" 5& 5& ։ൃதʜ

  29. اը σβΠφ ΤϯδχΞ 2" 5& 5& Ͱ͖ͨ

  30. اը σβΠφ ΤϯδχΞ 2" 5& 5& Ͱ͖ͨ σβΠϯ2"͠·͢Ͷ 2"։࢝͠·͢Ͷ

  31. اը σβΠφ ΤϯδχΞ 2" 5& 5& Ͱ͖ͨ σβΠϯ2"͠·͢Ͷ 2"։࢝͠·͢Ͷ

  32. اը σβΠφ ΤϯδχΞ 2" 5& 5& 2"தʜ

  33. اը σβΠφ ΤϯδχΞ 2" 5& 5& ΦοέʔͰ͢ ΦοέʔͰ͢

  34. اը σβΠφ ΤϯδχΞ 2" 5& 5& όΠφϦVQMPBEͨ͠Αʂ

  35. اը σβΠφ ΤϯδχΞ 2" 5& 5& όΠφϦVQMPBEͨ͠Αʂ ͓͔ͭΕ͞ΜͰͨ͠ʔ

  36. اը σβΠφ ΤϯδχΞ 2" 5& 5& "QQMFʹਃ੥ʂ

  37. ࠷ۙͷ։ൃํ਑

  38. 0CKFDUJWF$ͷίʔυྔͱϑΝΠϧ਺ pOEOBNF NcXDM  pOEOBNF NcYBSHTXDM 

  39. 0CKFDUJWF$ͷίʔυྔͱϑΝΠϧ਺ 4XJGUͷίʔυྔͱϑΝΠϧ਺ pOEOBNF NcXDM  pOEOBNF NcYBSHTXDM  pOEOBNF TXJGUcXDM

     pOEOBNF TXJGUcYBSHTXDM 12282
  40. ৽نίʔυ͸౰વ4XJGUͰॻ͘

  41. ৽نίʔυ͸౰વ4XJGUͰॻ͘ ͍ͭͰʹॻ͖׵͑Εͦ͏ͳ0CKFDUJWF $ϑΝΠϧ͸4XJGUͰϦϥΠτ͢Δʂ

  42. ৽نίʔυ͸౰વ4XJGUͰॻ͘ ͍ͭͰʹॻ͖׵͑Εͦ͏ͳ0CKFDUJWF $ϑΝΠϧ͸4XJGUͰϦϥΠτ͢Δʂ ɻɻɻ

  43. ৽نίʔυ͸౰વ4XJGUͰॻ͘ ͍ͭͰʹॻ͖׵͑Εͦ͏ͳ0CKFDUJWF $ϑΝΠϧ͸4XJGUͰϦϥΠτ͢Δʂ ʊਓਓਓਓਓʊ ʼɹͩΔ͍ɹʻ ʉ:?:?:?:ʉ

  44. ίϯόʔτπʔϧ࢖͓͏

  45. (FOFSBUFE*OUFSGBDF

  46. (FOFSBUFE*OUFSGBDF 9DPEFʙ

  47. (FOFSBUFE*OUFSGBDF @interface ExampleModel : NSObject @property (nonatomic) NSNumber *amount; @property

    (nonatomic, copy) NSString *datetime; @property (nonatomic, copy) NSString *title; @end public class ExampleModel : NSObject { public var amount: NSNumber! public var datetime: String! public var title: String! }
  48. IUUQPCKDTXJGUZBIPPMBCTKQ PCKDTXJGU 8FC4FSWJDF

  49. PCKDTXJGU 044

  50. 9$4XJGUS 9DPEF1MVHJO

  51. 9$4XJGUS 9DPEF1MVHJO

  52. ॻ͖׵͑Δ·Ͱ࣌ؒऔΕͳ͍

  53. ॻ͖׵͑Δ·Ͱ࣌ؒऔΕͳ͍ ʊਓਓਓਓਓਓਓਓਓਓਓਓਓਓਓਓਓʊ ʼɹͤΊͯ0CKFDUJWF$Λڧ͘͠Α͏ɹʻ ʉ:?:?:?:?:?:?:?:?:?:?:?:?:?:ʉ

  54. /VMMBCJMJUZ 9DPEFd  -JHIU8FJHIU(FOFSJDT 9DPEFd

  55. /VMMBCJMJUZ @property (nonnull, copy, nonatomic) NSString *name; @property (copy, nonatomic)

    NSString * __nonnull name; @property (copy, nonatomic) NSString * _Nonnull name; @property (nullable, copy, nonatomic) NSString *name; @property (copy, nonatomic) NSString * __nullable name; @property (copy, nonatomic) NSString * _Nullable name; - (void)example:(nonnull NSArray<NSString *> *)param; - (void)example:(NSArray<NSString *> * _Nonnull)param;
  56. /VMMBCJMJUZ // Objective-C + (NSString *)message; // ࣮͸ nil Λฦ͢ࣄ͕͋Δ

    // Swift Ͱ͸ func message() -> NSString! Example.message().characters // nil ฦͬͨ࣌ʹ Crash >< // Objective-C + (nullable NSString *)message; // nil ฦ͢ՄೳੑΛ໌ࣔ // Swift Ͱ͸ func message() -> NSString? Example.message()?.characters // Optional Ͱ nil safe
  57. /VMMBCJMJUZ ؂ࠪൣғʢ"VEJUFE3FHJPOTʣ NS_ASSUME_NONNULL_BEGIN @interface ExampleModel : NSObject @property (copy, nonatomic)

    NSString *name; @property (copy, nonatomic) NSString *country; @property (nullable, copy, nonatomic) NSString *hobby;
 @end NS_ASSUME_NONNULL_END
  58. -JHIU8FJHIU(FOFSJDT + (NSArray <NSString *>*)someArray { NSArray<NSString *> *var =

    @[@"test"]; return var; }
  59. -JHIU8FJHIU(FOFSJDT // Objective-C + (NSArray *)someArray { NSArray *var =

    @[@"test"]; return var; } // Swift Example.someArray()[0].characters
  60. -JHIU8FJHIU(FOFSJDT // Objective-C + (NSArray <NSString *> *)someArray { NSArray<NSString

    *> *var = @[@"test"]; return var; } // Swift Example.someArray()[0].characters
  61. -JHIU8FJHIU(FOFSJDT // Objective-C + (NSArray <NSString *> *)someArray { UIImage

    *image = [UIImage imageNamed:@"example.png"]; NSArray<UIImage *> *var = @[image]; return var; }
  62. -JHIU8FJHIU(FOFSJDT // Objective-C + (NSArray <NSString *> *)someArray { UIImage

    *image = [UIImage imageNamed:@"example.png"]; NSArray<UIImage *> *var = @[image]; return var; } // Swift Example.someArray()[0].characters
  63. -JHIU8FJHIU(FOFSJDT NSMutableArray<UIView *> *array = [@[] mutableCopy]; // MyView ͸

    UIView ͷαϒΫϥε [array addObject:[MyView new]]; MyView *myView = array[0];
  64. -JHIU8FJHIU(FOFSJDT NSMutableArray<__kindof UIView *> *array = [@[] mutableCopy]; // MyView

    ͸ UIView ͷαϒΫϥε [array addObject:[MyView new]]; MyView *myView = array[0];
  65. -JHIU8FJHIU(FOFSJDT Մಡੑ޲্ Swift ͱͷ૬ޓӡ༻ੑ޲্

  66. ϨΠΞ΢τ _textLabel.frame = (CGRect){ .origin.x = 0., .origin.y = CGRectGetMaxX(self.itemImageView.frame)

    + 3., .size.width = CGRectGetWidth(self.itemImageView.frame), .size.height = _textLabel.font.lineHeight * 2. + 7. };
  67. ϨΠΞ΢τ ౰વ"VUP-BZPVU࢖͏͔ΒYJCԽ͍ͯ͜͠͏ _textLabel.frame = (CGRect){ .origin.x = 0., .origin.y =

    CGRectGetMaxX(self.itemImageView.frame) + 3., .size.width = CGRectGetWidth(self.itemImageView.frame), .size.height = _textLabel.font.lineHeight * 2. + 7. };
  68. ϨΠΞ΢τ @IBInspectable var borderColor: UIColor = UIColor.clearColor() { didSet {

    layer.borderColor = borderColor.CGColor } } @IBInspectable var cornerRadius: CGFloat = 0 { didSet { layer.cornerRadius = cornerRadius } } *#*OTQFDUBCMF
  69. ϨΠΞ΢τ @IBInspectable var borderColor: UIColor = UIColor.clearColor() { didSet {

    layer.borderColor = borderColor.CGColor } } @IBInspectable var cornerRadius: CGFloat = 0 { didSet { layer.cornerRadius = cornerRadius } } *#*OTQFDUBCMF
  70. ϨΠΞ΢τ 6*7JFX$POUSPMMFS4UPSZ#PBSEԽ

  71. ϨΠΞ΢τ 6*7JFX$POUSPMMFS4UPSZ#PBSEԽ import UIKit protocol StoryBoardable extension StoryBoardable where Self:

    UIViewController { static func viewControllerFromStoryboard() -> Self { let storyboard = UIStoryboard(name: className, bundle: nil) return storyboard.instantiateViewControllerWithIdentifier( className ) as! Self } }
  72. ϨΠΞ΢τ 6*7JFX$POUSPMMFS4UPSZ#PBSEԽ // for Objective-C extension UIViewController { @available(*, unavailable)

    @objc static func viewControllerFromStoryboard() -> UIViewController { let storyboard = UIStoryboard(name: className, bundle: nil) return storyboard. instantiateViewControllerWithIdentifier(className) } }
  73. ϨΠΞ΢τ 6*7JFX$POUSPMMFS4UPSZ#PBSEԽ // from Swift let vc = viewControllerFromStoryboard() //

    from Objective-C MyViewController *viewController = (MyViewController *)[MyViewController viewControllerFromStoryboard];
  74. ࣾ಺ศརXFCαʔϏε

  75. O%FQMPZ

  76. O%FQMPZ

  77. "QQ%FQMPZ

  78. /1VTI "1/4 ($. ֤αʔϏεαʔό /1VTIαʔό

  79. /&-0

  80. "QQ3FWJFXT

  81. $IBU014 IVCPU

  82. ·ͱΊ 4XJGUͰॻ͚ͳ͍࣌͸0CKFDUJWF$ͷ৽͍͠ػೳ࢖ͬͯ ૬ޓӡ༻ੑ্͍͛ͯ͜͏ "VUP-BZPVU͍΍Ͱ΋׳ΕΑ͏ -*/&ࣾ͸ศརπʔϧ͕ϞϦϞϦ͋Γ·͢ɻҰॹʹಇ͜͏ʂ 0CKFDUJWF$Λ4XJGUʹҠߦ͢Δͱ͖͸ίϯόʔτπʔϧ Λ͖͔͚ͬʹ͢ΔͱḿΔ