第3回 カジュアル Swift 勉強会 @ 青葉台 : ATNDの発表資料
自己紹介
いろいろ質問させてください
- みんなで"わからないこと"を共有したい
- StackOverflowでやれ的な内容でごめんなさい
- 粒度はバラバラです
質問1. classに所属してないfuncは何者..?
class Hoge {
// こいつはわかる
func fuga() {
}
// こいつもわかる
class func huga() {
}
}
// 誰だおまえ
func piyo() {
}
- piyo()はどこからでも実行できる?
- だれが持っているメソッド?
- Objective-Cでも同様のことが実現できる?
質問2. 循環参照について
- サンプルコード: haranicle/MemoryLeaks · GitHub
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出してくれるのは素敵

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?()
}
}
- Swiftだとwarning出してくれない?
- Capture Listは、とりあえず
[weak self]
って書いておけばいいと思ってる- unowndの使いドコロとは
-
help - Swiftのクロージャにおける循環参照問題でunownedとweakの使い分けがわからない - Qiita
- オブジェクト破棄時にnilクリアされる??
質問3. Swifを気持よく書くための情報ください
- コードフォーマッタと静的解析を自動でしてほしい
- コードフォーマッタと静的解析のルールがセットで用意されていてほしい
- 例えば折り返し文字数とかは、それぞれのルールで統一されてないとだめなので
- ルールはプロジェクトに紐づく形でチーム内で共有されていてほしい
- コードフォーマッタと静的解析のルールがセットで用意されていてほしい
コードフォーマッタ
clang-format
uncrustify
SwiftFormat
- haaakon/SwiftFormat · GitHub
- Pythonで書かれたスクリプト
- Run Scriptとかに設定すれば、ビルド時に静的解析できそう
- 整形ルールとかはスクリプトちょくでいじらないといけなさそう
- ちょっとつらい
Swift-Cleaner
- niebloomj/Swift-Cleaner · GitHub
- Pythonで書かれたスクリプト
- SwiftFormatと同じ感じ
他にいいのない...?
静的解析
SwiftLint
- 公式: realm/SwiftLint · GitHub
- 日本語解説記事: iOS - SwiftLintを試してみた - Qiita
- homebrew or 自分でビルド で導入
- github/swift-style-guideベースのルール
- .swiftlint.ymlというファイルにルール設定を記述できる
- コード内で
// swiftlint:disable <rule>
って書いたところからswiftlint:enable <rule>
って書いたところまでルール無視できる - 良さそう