0
0

【Python】「Swiftのアレ、Pythonだとどうだっけ」を自分なりに

Posted at

誰?

基本的に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ではどうしてるか、みたいなのも書こうと思いました。
でもめんどくさくなったうまく書ける自信が無かったのでやめておきます。
そもそも非同期苦手だし・・・。

0
0
0

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
0
0