2016-10-08 9 views
2

Iは単位値に応じて、キーの文字列を設定するために、次のスウィフトコードを使用:警告は、ローカルスコープで発生

let units = 0 
let key = units == 0 ? "F" : "C" 
// this example makes key = "F" 

上記の例は、それがある場合に警告なしとそれが必要として動作Swiftファイルのグローバルスコープで私は初期にまたは関数に同じコードを配置する場合しかし、私は、「C」という用語を参照の警告が表示されます。三条件がローカルで使用されている場合

struct Almanac { 
    // properties 
} 

extension Almanac { 

    init?(json: [String: Any]) { 
     let units = 0 
     let key = units == 0 ? "F" : "C" // WARNING: Will never be executed 

     // ... 
    } 

} 

func logunits() { 
    let units = 0 
    let key = units == 0 ? "F" : "C" // WARNING: Will never be executed 
    print("key is \(key)") 
} 

はなぜこの警告は表示されません範囲?

+0

を私の知る限り見ることができるように、これは持っている:任意のコードがunitsの値が、この例のようにも愚かなものを変更することができますパスにありますならば、警告がまた消えること

注意failable initialisersとは何の関係もありません。コードを関数に置くだけで同じ警告が表示されます。 main.swiftファイルの最上位にあるとき、または遊び場にいるときに警告を出すことはありません(これが意図されているかどうかはわかりません) – Hamish

+0

@ハミッシュあなたのコメントに基づいて、質問。私はまだオペレータの範囲が警告を引き起こす理由を知りたいです。 – wigging

答えて

0

これはスコープに関連しています。これは、スコープによってはコンパイラが簡単な式を解決して一部の部分が実行されないことがあるためです。

func logunits() { 
    let units = 0 
    let key = units == 0 ? "F" : "C" 
    print("key is \(key)") 
} 

コンパイラが同じスコープにunits = 0units == 0 ?を持っているので、(何も2つのライン間のunitsの値を変更しないので)パスを解決することが可能であるとことを教えてくれ:これにより

はい、確かに、unitsは0であり、 "C"は常に無視されます。

func logunits() { 
    let units = 1 
    let key = units == 0 ? "F" : "C" 
    print("key is \(key)") 
} 

警告が突然 "C" を "F" からジャンプ:あなたは値を変更した場合

。 :)

そして、あなたがスコープ外に価値を置く場合:

let units = 0 

func logunits() { 
    let key = units == 0 ? "F" : "C" 
    print("key is \(key)") 
} 

警告が消えます。

func logunits() { 
    var units = 0 
    if true { units = 1 } 
    let key = units == 0 ? "F" : "C" 
    print("key is \(key)") 
} 
+0

これはXcodeのコンパイラのバグですか? – wigging

+0

なぜ、それはいくつかのコンテキストではなく、他のコンテキストでの値をチェックできるのですか? – wigging

+0

@wigging一部のコンテキストでは、ローカルスコープ内にあり、2つの行が連続している場合など、値が変更されないことがわかるためです。コンパイラに "これはゼロの値を持っています、ああ、それは値なのですから、私はこの他のものを選ぶことができますか?" 「まあ、前に言ったように、それはゼロです」と答えます。値を変更できるものを導入した場合、この機能は動作を停止します。これは、コンテキストが解析された値に対して突然変異がないことを100%保証している場合にのみ機能するためです。実行時に値が変更される可能性がある場合、このコンパイラ機能は適用されません。 – Moritz

関連する問題