2016-06-17 13 views
4

Xcode 8ベータ版をダウンロードして、Swift 3に構文を変換しました。私がしたとき、私はこのコードで偶然のエラーになりました。エラー:Swift 3のメンバー 'subscript'へのあいまいな参照

スウィフト3:

do { 
    let fileAttributes = try FileManager.default().attributesOfItem(atPath: fileURL.path!) // Error here 
    let fileSizeNumber = fileAttributes[NSFileSize] as! NSNumber 
    fileSize = fileSizeNumber.longLongValue 
} catch _ as NSError { 
    print("Filesize reading failed") 
} 

スウィフト2:

do { 
    let fileAttributes = try NSFileManager.defaultManager().attributesOfItemAtPath(fileURL.path!) 
    let fileSizeNumber = fileAttributes[NSFileSize] as! NSNumber 
    fileSize = fileSizeNumber.longLongValue 
} catch _ as NSError { 
    print("Filesize reading failed") 
} 

が、これはスウィフト3のバグですか、私は何かが足りないのですか?

私は同じエラーについて多くの質問があることを知っていますが、それらは私の問題を解決しません。私は説明のために編集してうれしいです。

ありがとうございます!

+1

私が遊び場にこのエラーを得ることはありません。これについてもっとコードを提供できますか?元のSwift 2.2コード。 –

+0

@EricDいいえ。このエラーはビルド/実行する前に表示されます。私は定数のリストを見つけた – atirit

答えて

7

私はこのような何かが動作するはずだと思う:

do { 
    let fileAttributes = try FileManager.default().attributesOfItem(atPath: file.path!) 
    if let fileSizeNumber = fileAttributes["NSFileSize"] as? NSNumber { 
     let fileSize = fileSizeNumber.int64Value 

    } 
} catch let error as NSError { 
    print("Filesize reading failed: \(error.debugDescription)") 
} 

NSFileSizeが、私はその生の値で、それを置き換えてきただけで定数文字列だったので。それは大丈夫だと思われますが、公式の同等のものを見つけるほうがいいでしょう(これは私が今扱っていなかったので、この解決法を当然のものとしないでください)。 Xcodeの8 GMのための

更新:FileAttributeKey.sizeを使用して

は、ハードコードさ定数(リマインダーに感謝@rudy)を使用するよりも優れています。ここでは、更新の例です:これはスウィフト3で動作

do { 
    let attributes = try FileManager.default.attributesOfItem(atPath: file.path) 
    if let size = attributes[FileAttributeKey.size] as? NSNumber { 
     let fileSize = size.int64Value 
     print(fileSize) 
    } 
} catch { 
    print(error.localizedDescription) 
} 
+0

:https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSFileManager_Class/#//apple_ref/doc/constant_group/File_Attribute_Keysは、しかし、このドキュメントはhasnスイフト3に更新されました。 – Moritz

+0

NSFileSize.rawValueは、定数の名前が実際の文字列と同じであることが保証されていないため、より良い結果を得ることができます。 – rudy

+0

@rudyあなたはハードコードされた値について正しいです。私は私の答えをうかがった。 – Moritz

1

var fileSize: UInt64 // size in bytes 

do { 
    let fileAttributes: NSDictionary? = try FileManager.default().attributesOfItem(atPath: fileURL.path!) 
    if let fileSizeNumber = fileAttributes?.fileSize() { fileSize = fileSizeNumber } 
} catch let error as NSError { 
    print("Filesize reading failed: \(error.debugDescription)") 
} 

NSDictionaryのに属性をキャストすることによって、多くの組み込みの方法は.fileSize(含む利用可能になる):

  • .fileGroupOwnerAccountName()
  • .fileModificationDate()
  • .fileOwnerAccountName()
  • .filePosixPermissions()
  • .fileSize()
  • .fileSystemFileNumber()
  • .fileSystemNumber()
  • .fileType()

これは、スウィフトにクリックオプションでそれらを検査することで、その戻り値のデータタイプを発見するのは簡単です。

1

呼び出しから返されたので、これは辞書に取り組んでいます:

fileAttributes[FileAttributeKey.size.rawValue] 

(XCode8 WWDCのようスウィフト3)

関連する問題