39
36

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

  • なんでもweakSelfにしなくてもいいよね?
    • なんでもweakSelfにしちゃうと、weakSelfが意図しないタイミングでnilになっちゃうことがありえるから
  • 主にpropertyでblocks持ってる時にのみ、blocks内からselfにアクセスしたらメモリリークするという認識で合ってる?
  • warning出してくれるのは素敵
* ```self.completion = nil;```ってすると、メモリリークしてないっぽい * そもそもリリースカウント無視してnilぶっこめばメモリリークしない? * [前記事の補足:プロパティへのnil代入がreleaseの代わりになる理由 - iPhoneアプリ開発まっしぐら★ - iPhoneアプリ開発グループ](http://iphone-dev.g.hatena.ne.jp/tokorom/20100315/1268677134) * deallocはnilを代入することと等価なの??? * SwiftだとOptional以外のプロパティは必殺nil代入releaseできないよね? * 代替手段ある?(そもそも必殺nil代入releaseするべきでない?)

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?