LoginSignup
39
36

More than 5 years have passed since last update.

Swiftについて聞きたいこと #cswift

Last updated at Posted at 2015-11-14

第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
  • Pythonで書かれたスクリプト
  • Run Scriptとかに設定すれば、ビルド時に静的解析できそう
  • 整形ルールとかはスクリプトちょくでいじらないといけなさそう
    • ちょっとつらい

Swift-Cleaner

他にいいのない...?

静的解析

SwiftLint

他にいいのない...?

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

39
36
8

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
39
36