18976
plistファイルとして、documentに保存したいのですが、パスの設定でエラーが出てしまいます。  
原因がわかる方がいましたら、ご教授お願いします。

```

    var fileName: NSDictionary = [
        "Name": "A",
        "Address": "B",
        "Tel": "C",
    ]
    
    //保存先の設定（パスの設定）
    func getCacheDirectory() -> String {
        let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true) as [String]
        print(paths)
        return paths[0]
    }
    
    func getFileURL() -> NSURL{
        let path  = (getCacheDirectory() as NSString).stringByAppendingPathComponent(fileName)//ここでCannot convert value of type 'NSDictionary' to expected argument type 'String'というエラーが出ます。
    
        let filePath = NSURL(fileURLWithPath: path)
    
        return filePath
    }
    
```

以上のエラーがわからないため、原因がわかる方がいましたらよろしくお願いいたします。

* * *

追記  
違う方法でも試した 以上のですエラーがわからないため、また下記の部分でエラー原因が出てしまいわかる方がいましたらよろしくお願いいたします。

let paths = NSSearchPathForDirectoriesInDomains(  
.DocumentDirectory,  
.UserDomainMask, true)

let documentsPath = paths[0]  
let path = (paths[0] as
NSString).stringByAppendingPathComponent("datastore.plist")

var user:NSDictionary = [  
"Name": "A",  
"Age": "B",  
"Sex": "C",  
]

if let success = user.writeToFile(path, atomically: true) {//Statements are
not allowed at the top level、さらにInitializer for conditional binding must have
Optional type, not 'Bool'この２つのエラーです。  
print("success!")  
} else {  
print("failure!")  
}
CC BY-SA 3.0
2015-11-18T05:29:30.407
18964
2015-11-19T08:44:14.190
2015-11-19T08:44:14.190
7362
12536
question
swift xcode
Documentへの保存方法
```

    if let success = user.writeToFile(path, atomically: true) {
    
```

Swiftの構文は、C言語の構文を踏襲したものになっていますが、決定的にC言語（Objective-
C含む）と異なる点がいくつかあります。C言語、Objective-CからSwiftに入った人は、きっちり相違点を認識しなくてはいけません。  
重要な相違点のひとつに、「 **代入式は評価しない** 」というのがあります。

_C言語_

```

    int a;
    int result = (a = 100);
    
```

C言語は、代入式`a =
100;`を評価します。評価するとは、ある値を返すという意味です。この代入式は、評価されて、`100`という値を返します。よって、変数`result`には、`100`が代入されます。  
Swiftは、代入式を評価しないので、上のコードとおなじコードを書くと、エラーになります。

_Swift_

```

    var a = 0
    let result = (a = 100) // 警告：Constant 'result' inferred to have type '()', may be unexpected
    
```

この相違は、おそらく以下のよくある入力ミスを防ぐためのものと考えられます。

```

    int a = 100;
    int b = 200;
    if (a = b) { // ほんとうはif (a == b)としたかった。
        printf("Equal\n");
    } else (
        printf("Not Equal\n");
    }
    
```

`a`と`b`は、値が異なるので、「Not Equal」と出力したかったのだが、式`a =
b`は、代入して`200`と評価されるので、`0`ではなく、条件式は`true`になり、「Equal」が出力されます。  
代入式を評価しなければ、このイージーミスは起きません。

代入式は、Swiftでは評価されないので、

```

    if let success = user.writeToFile(path, atomically: true) {
    
```

はエラーになります。最初のエラーメッセージ

> Statements are not allowed at the top level

は、このことを指しています。

ところが、Swiftのプログラムで、次のようなコードをよく見かけます。

```

    if let a = Int("100") {
        print(a)
    }
    
```

これは、 **Optional Binding**
という特殊な構文です。Optional値をUnwrapし、非Optional値に代入する構文であって、ただの条件文ではないんです。  
`Int(_: String)`というイニシアライザは、文字列を整数値Intに変換しますが、Optional型で返します。

```

    let optionalA: Int? = Int("100")
    
```

Optional型の値をUnwrapして、非Optional型`a`に代入するという意味が、

```

    if let a = Int("100")
    
```

にあります。  
（Optional Bindingは、`else`以下があると、Optional型の値が`nil`の場合を実行します。）

さて、

```

    if let success = user.writeToFile(path, atomically: true) {
    
```

`NSDictionary`のメソッド`writeToFile()`は、非Optional型のBool値を返しますから、このコードはエラーになります。2番目のエラーメッセージ

> Initializer for conditional binding must have Optional type, not 'Bool'

は、このことを指しています。

以上から、正しいコードは

```

    let success = user.writeToFile(path, atomically: true)
    if success == true {
    
```

ないし

```

    let success = user.writeToFile(path, atomically: true)
    if success {
    
```

になります。
CC BY-SA 3.0
2015-11-18T08:01:09.053
18976
2015-11-18T08:07:07.800
2015-11-18T08:07:07.800
7362
7362
18964
answer