Attention! Translated article might be found on my English blog.
ラベル Swift の投稿を表示しています。 すべての投稿を表示
ラベル Swift の投稿を表示しています。 すべての投稿を表示

2018年1月12日金曜日

Swiftメモ(Obj-Cユーザ向け)

・SwiftでCocoaフレームワーク作成:

ターゲット追加時のウィザードでswiftによるcocoaフレームワークを設定できていれば、
公開したいクラスやメソッドにpublicを付けるだけで良さそう。

参考: ios8 - How do I add a swift class to my framework header? - Stack Overflow

Xcodeの右ペインでObj-Cのヘッダファイルに設定していたPublic/Private/Projectに相当するのは
public/private/internalっぽいですねどうやら。

参考: Swift: how can I create external interface for static library (public headers analog in Objective-C .h) - Stack Overflow

・stringByAppendingPathComponent:

先にURLオブジェクトを作ってからappendingPathComponent(pathComponent:)を使うっぽい。

・変数末尾の'!'や'?':

?がnilを許容…くらいの知識しか無いので、
2.1.12. オプショナル | 基本 | Swift | スタジオガラゴを後で読む。
変数がnilだった場合のデフォルト値として'??'というのものあるようですね。

・#pragma mark:

// MARK:を使う。

参考:#pragma mark in Swift? - Stack Overflow

・isKindOfClass:

is という演算子を使う。

参考:ios - Using isKindOfClass with Swift - Stack Overflow

・その他不明点:

・blocksを引数に含む場合の書き方がよくわからん
・@escapingとは?
・NSLogとフォーマットまわり

2018年1月4日木曜日

古いswiftプロジェクトをビルドし直してみた

2014年に書いたコードを久々にビルドしようとしたらエラーの嵐でした。
大部分は自動修正(?)で直ったものの、自分で調べて直さないといけないのも結構ありました。

以下、修正時の置き換えメモです。

CGSizeMake, CGPointMake:

CGSizeMake -> CGSize(width:height:)
CGPointMake -> CGPoint(x:y:)

参考: uikit - CGRectMake, CGPointMake, CGSizeMake, CGRectZero, CGPointZero is unavailable in Swift - Stack Overflow

CGVectorMake:

CGVectorMake -> CGVector(dx:dy:)

参考: sprite kit - cgvectormake is unavailable in swift - Stack Overflow

"C-style for statement has been removed in Swift 3":

Swift styleを使う。 for i in 0..<len {}

参考: for loop - Fix warning "C-style for Statement is deprecated" in Swift 3 - Stack Overflow

"Type 'NSCompositingOperation' has no member 'CompositeCopy'":

NSCompositingOperation.copy?


Unary operator '++' cannot be applied to an operand of type '@lvalue NSInteger' (aka '@lvalue Int'):

++や--の代わりに+= 1, -= 1を使う

参考: swift - Unary operator '--' cannot be applied to an operand of type '@lvalue Int?' (aka '@lvalue Optional<Int>') - Stack Overflow


"Cannot convert value of type 'ObjCBool' to expected argument type 'Bool'":

hogeそのものではなくhoge.boolValueを使う

参考: Swift3でObjCBoolとBoolが変換できない件 - 泣きながらプログラミング。


その他:

rand() -> arc4random()
SKPhysicsBody(rectangleOfSize:) -> SKPhysicsBody(rectangleOf:)
func applicationDidFinishLaunching(aNotification : NSNotification) -> func applicationDidFinishLaunching(_ notification: Notification)
func didBeginContact(contact: SKPhysicsContact)  -> func didBegin(_ contact: SKPhysicsContact)


ちなみに、同時期に作っていたObj-Cのプロジェクトはそのままビルドできて普通に動いたという…。

2014年11月8日土曜日

ObjCとSwiftで共通のenumを使う場合はObjC側にenumを書く

ObjC側からSwiftのenumは使えないようです。
参考: objective c - Is it possible to use Swift's Enum in Obj-C? - Stack Overflow

よってSwift側からObjCのenumを参照します。
共用する場合、ObjC側ではtypedef enumの代わりにNS_ENUMまたはNS_OPTIONSを使って宣言する必要があるようです。
参考: SwiftからObjective-Cのenumを扱う時の注意事項2 - tomoyaonishiのブログ

例えば、以下のようなenumの場合、

typedef enum TRRPlayerDirection {
    kTRRPlayerDirection_Right,
    kTRRPlayerDirection_Left

} TRRPlayerDirection;

NS_ENUMを使い、

NS_ENUM(NSInteger, TRRPlayerDirection) {
    kTRRPlayerDirection_Right,
    kTRRPlayerDirection_Left

};

と修正する必要があります。

Swift側ではenum名の'TRRPlayerDirection'以外にも接頭辞のkとアンダースコアを除外するのか、
TRRPlayerDirection.RightおよびTRRPlayerDirection.Leftという記述でenum要素を参照することができます。

MAX(), MIN()マクロのSwift版

Swiftではmax()およびmin()という関数があるようです。

/// Return the greatest argument passed
func max<T : Comparable>(x: T, y: T, z: T, rest: T...) -> T


/// Return the greater of `x` and `y`

func max<T : Comparable>(x: T, y: T) -> T

/// Return the lesser of `x` and `y`
func min<T : Comparable>(x: T, y: T) -> T


/// Return the least argument passed
func min<T : Comparable>(x: T, y: T, z: T, rest: T...) -> T

Swiftコード編集中にSourceServiceKitがクラッシュする

Xcode 6.1(6A1052c)にsて、Swiftコード編集中にSourceServiceKitがクラッシュする現象が多発しました。ウインドウに"SourceKitService Crashed Crashlog generated in ~/Library/Logs/DiagnosticReports Editor functionality temporarily limited."と表示され、書いてるコードが読みにくく、カラーシンタックスやオートインデントが効いたり効かなかったりという状態が続きました。
こちらの環境では、~/Library/Developer/Xcode/DerivedData内のフォルダを全て削除することでクラッシュしなくなりました。

参考:ios - Swift SourceKitService Crashed - Stack Overflow

環境設定のLocations - Locations - Derived Data:をDefault以外にしている場合は、他のディレクトリを削除する必要があるかもしれません。

#pragma markのSwift版

#pragma mark の代わりに // MARK: というキーワードが使えます。

参考: xcode - #pragma mark in Swift? - Stack Overflow

例えば以下のようにコメントを加えると、

ウインドウ上部のパンくずのメニューには以下のように表示されます。

#pragma markと同様にハイフンでセパレータを挿入することもできるようです。