質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

3842閲覧

if文の中で定義した変数をクロージャ外で使いたい

ShuyaOgawa

総合スコア17

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2017/12/12 17:59

編集2017/12/12 18:05

if a > b {
var X = "patern 1"
}

if a < b {
var X = "pattern 2"
}

と定義して、この下でXを使いたいです。本来ならif文の中に入れればいいのですが、長いプログラムであることとどちらのif文の中でも処理が同じなのでifの中に書きたくないです。
何かいい方法はありますでしょうか。

具体的には、

override func viewDidLoad() {

self.function()

ref.observe(.value, with: { snapshot in
〜〜〜〜
〜〜〜〜

}

func function() -> DatabaseReference {
if a > b {
var ref = patern 1
return ref
}

if a < b {
var ref = pattern 2
return ref
}
}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ご質問に挙げておられる例だけ眺めると、function内部の変数を外部から参照する必要はなく単に値を返せばよいように思えます。

もし文字通りブロック内部の変数を外部からアクセスするようにということならクロージャーを返せば実現はできると思います。

swift

1class Foo { 2 var a: Int! 3 var b: Int! 4 5 init(_ a: Int, _ b: Int) { 6 self.a = a; 7 self.b = b; 8 } 9 10 func foo() -> (Int, Int) { 11 let (ref, update) = bar() 12 let r1 = ref() 13 update() 14 let r2 = ref() 15 16 return (r1, r2) 17 } 18 19 func bar() -> (() -> Int, () -> ()) { 20 if a > b { 21 var ref = 100 22 return ({ () in ref }, { () in ref += 1 }) 23 } 24 25 if a < b { 26 var ref = 200 27 return ({ () in ref }, { () in ref -= 1 }) 28 } 29 30 return ({ () in 0 }, { () in }) 31 } 32} 33 34let v1 = Foo(1, 2) 35let v2 = Foo(2, 1) 36let v3 = Foo(1, 1) 37print(v1.foo()) 38print(v2.foo()) 39print(v3.foo()) 40

結果:
(200, 201)
(100, 99)
(0, 0)

ただ、可能なら上記のようなややトリッキーな方法よりは単に共通処理を関数化し以下のようにした方が素直で読みやすくなる気がします。

Swfit

1func foo() { 2 if a < b { 3 let ref = ... pattern 1 ... 4 bar(ref) 5 } 6 7 if a > b { 8 let ref = ... pattern 2 ... 9 bar(ref) 10 } 11 12 func bar(ref: DatabaseReference) { 13 ... 14 } 15} 16 17// あるいは 18 19func foo(operation: (dbr: DatabaseReference)->()) { 20 if a < b { 21 let ref = ... pattern 1 ... 22 operation(ref) 23 } 24 25 if a > b { 26 let ref = ... pattern 2 ... 27 operation(ref) 28 } 29}

投稿2017/12/13 00:36

編集2017/12/13 00:40
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

swift

1var X: String? 2if a > b { 3 X = "patern 1" 4} 5 6if a < b { 7 X = "pattern 2" 8}

こういうこと?
イコールのときにどうするか考えないといけませんね。
あと、これはクロージャとは言いません。(ただのブロック。ステートメントブロックって言うらしい?Swiftでの正式名称は分かりません)

投稿2017/12/13 00:25

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KSwordOfHaste

2017/12/13 00:42

う・・・自分の回答で最初「もし文字通りクロージャー内部の変数を」と書いてましたがfuzzballさんの回答が付いているのに気づきそれを拝見して用語がおかしいことに気づきました。「ブロック内部の変数を」で通じそうですね・・・
ShuyaOgawa

2017/12/13 06:42

クロージャを改めて調べて違う認識をしていたことに気づきました。 お二方により解決することができました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問