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

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

ただいまの
回答率

91.24%

  • Swift

    5352questions

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

  • 関数

    161questions

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

  • if

    133questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 102

ShuyaOgawa

score 11

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/13 09:42

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

    キャンセル

  • 2017/12/13 15:42

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

    キャンセル

0

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

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

class Foo {
  var a: Int!
  var b: Int!

  init(_ a: Int, _ b: Int) {
    self.a = a;
    self.b = b;
  }

  func foo() -> (Int, Int) {
    let (ref, update) = bar()
    let r1 = ref()
    update()
    let r2 = ref()

    return (r1, r2)
  }

  func bar() -> (() -> Int, () -> ()) {
    if a > b {
      var ref = 100
      return ({ () in ref }, { () in ref += 1 })
    }

    if a < b {
      var ref = 200
      return ({ () in ref }, { () in ref -= 1 })
    }

    return ({ () in 0 }, { () in })
  }
}

let v1 = Foo(1, 2)
let v2 = Foo(2, 1)
let v3 = Foo(1, 1)
print(v1.foo())
print(v2.foo())
print(v3.foo())


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

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

func foo() {
  if a < b {
    let ref = ... pattern 1 ...
    bar(ref)
  }

  if a > b {
    let ref = ... pattern 2 ...
    bar(ref)
  }

  func bar(ref: DatabaseReference) {
    ...
  }
}

// あるいは

func foo(operation: (dbr: DatabaseReference)->()) {
  if a < b {
    let ref = ... pattern 1 ...
    operation(ref)
  }

  if a > b {
    let ref = ... pattern 2 ...
    operation(ref)
  }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

ただいまの回答率

91.24%

関連した質問

同じタグがついた質問を見る

  • Swift

    5352questions

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

  • 関数

    161questions

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

  • if

    133questions

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