誰?
基本的にpythonを書いているものです。
SwiftでiOSアプリ開発の経験も少しあります。
元からpythonメインだったのですが、仕事の関係でSwiftメインになり、またpythonに戻ってきました。
何を思ってこの記事を?
長いことpythonを離れてSwiftを書いていたら、Swiftチックな考えが残ったままPythonを書くことになっています。
戻ってきてすぐは、Swiftの文法は思いつくのにpythonの書き方が思いつかなかったりしました。
そんな自分が、「Swiftのアレ、Pythonだとどうだっけ」と思って自分なりに出した答えを書いておこうと思います。
全部は網羅しきれないので、思いついたものを書いていきます。思いつかなくなったらそこで筆は止まります。
また、これが本当に正しいとは限りません。
基本的には、Swift→pythonに書きなおすので、逆はしません。
独断と偏見と深夜テンションです。
間違っていたり、内容が薄っぺらい可能性があります。
こんなもん、何をいまさら偉そうに語っとんねん。的なことは怖いので言わないでください。
1. if let x = ~~
swift
// self.getResult() -> String?
if let result = self.getResult() {
// ここではresultが非Optional
}
python
if result := self.get_result():
# ここではbool(result)=True
Swiftでは結果がOptionalかどうかを見て、PythonではFalseになるかどうかで見る。
注意としては、こんなケースがある。
・DBがNULL許容のVARCHARで、その値がNULLでなければhoge処理をしたい
-> 空文字列のときにhoge処理をしてもいいか?を考えないといけない
2. guard let (条件) else ~~
swift
guard let isAvailable else {
// 現在までの状態をStateに反映しておく
self.setState(currentState)
return
}
python
if not is_available:
self.set_state(current_state)
return
それはそう。
3. if let (変数) = (型不明な変数) as? (型) ~~
swift
struct MainModel: BaseModel
struct DetailModel: BaseModel
struct RelationModel: BaseModel
if let state = state as? MainModel {
// stateをMainModelとして扱う
}
if let state = state as? BaseModel {
// stateをBaseModelとして扱う
}
python
class MainModel: BaseModel
class DetailModel: BaseModel
class RelationModel: BaseModel
if type(state) == MainModel:
# stateはMainModelを継承している
if isinstance(state, BaseModel):
# stateはBaseModelを継承している、もしくは継承したクラスを継承している
pythonに慣れてたら「そうだね」ってなるけど、Swiftに慣れてると「めんどう」ってなる。
他に良い書き方があるかもしれないけど、パッと思いつくのはこの様な形。
4. let (変数) = (Optional変数) ?? (変わりの値)
swift
let number = getNumber() ?? Int64(-1)
python
number = get_number() or -1
number = -1 if (_number := get_number()) == None else _number
pythonコードの上の方はboolキャスト時にFalseになる値が返ってきたら対応できない。
Noneが返って来るとか、空リストが返って来るとか、そもそもFalseになる値が返ってこないとか、
そういうのが分かってなければ下のを使った方が良い。
おわり?
意外と思いつきませんでした。
なにか思い出したら追記しようと思います。
書き換えとは違うんですが、delegateとかDispatchQueueとかProtocolとか、あんまりPythonで使われない概念をPythonではどうしてるか、みたいなのも書こうと思いました。
でもめんどくさくなったうまく書ける自信が無かったのでやめておきます。
そもそも非同期苦手だし・・・。