More than 1 year has passed since last update.

第3回 カジュアル Swift 勉強会 @ 青葉台 : ATNDの発表資料

自己紹介

haranicle

いろいろ質問させてください

  • みんなで"わからないこと"を共有したい
  • StackOverflowでやれ的な内容でごめんなさい
  • 粒度はバラバラです

質問1. classに所属してないfuncは何者..?

class Hoge {

    // こいつはわかる
    func fuga() {
    }

    // こいつもわかる
    class func huga() {
    }
}

// 誰だおまえ
func piyo() {
}
  • piyo()はどこからでも実行できる?
  • だれが持っているメソッド?
  • Objective-Cでも同様のことが実現できる?

質問2. 循環参照について

Blocks (Objective-C)

#import "ObjCObject.h"

@interface ObjCObject ()
@property (nonatomic) NSString* title;
@property (nonatomic, copy) void (^completion)();
@end

@implementation ObjCObject

- (instancetype)init
{
    self = [super init];
    if (self) {
        self.title = @"Objc Object";
    }
    return self;
}

// リークしない
- (void)doSomethingAsync {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"%@", _title);
    });
}

// selfがリークする
- (void)doSomething {
    self.completion = ^void() {
        NSLog(@"%@", _title);
    };
    _completion(); 
    // self.completion = nil; // これがあるとちゃんとreleaseされていることになる
}

// リークしない
- (void)doSomethingWithWeakSelf {
    __weak ObjCObject *weakSelf = self;
    self.completion = ^void() {
        NSLog(@"%@", weakSelf.title);
    };
    _completion();
}

@end

Closure (Swift)

import UIKit

class SwiftObject: NSObject {
    var title = "Swift Object"
    var completion:(()->())?

    override init() {
        super.init()
    }

    // リークしない
    func doSomethingAsync() {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { () -> Void in
            print(self.title)
        }
    }

    // selfがリークする
    func doSomething() {
        completion = { () in
            print(self.title)
        }
        completion?()
        // completion = nil // これがあるとちゃんとreleaseされていることになる
    }

    // リークしない
    func doSomethingWithWeakSelf() {
        weak var weakSelf = self
        completion = {() in
            print(weakSelf!.title)
        }
        completion?()
    }

    // リークしない
    func doSomethingWithCaptureList() {
        completion = {[weak self] () in
            print(self!.title)
        }
        completion?()
    }

}

質問3. Swifを気持よく書くための情報ください

  • コードフォーマッタと静的解析を自動でしてほしい
    • コードフォーマッタと静的解析のルールがセットで用意されていてほしい
      • 例えば折り返し文字数とかは、それぞれのルールで統一されてないとだめなので
    • ルールはプロジェクトに紐づく形でチーム内で共有されていてほしい

コードフォーマッタ

clang-format

uncrustify

SwiftFormat

  • haaakon/SwiftFormat · GitHub
  • Pyhonで書かれたスクリプト
  • Run Scriptとかに設定すれば、ビルド時に静的解析できそう
  • 整形ルールとかはスクリプトちょくでいじらないといけなさそう
    • ちょっとつらい

Swift-Cleaner

他にいいのない...?

静的解析

SwiftLint

他にいいのない...?

質問4. コーディング規約どうしてる?