2016-06-17 5 views
4

Xcode 8 베타를 다운로드하고 Swift 3으로 내 구문을 변환했습니다. 내가했을 때,이 코드로 시제 적 오류가 발생했습니다 (이전에는 발생하지 않았습니다) :Error : 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

(스위프트 3 XCode8 WWDC 현재). 이 문제에 대해 더 많은 코드를 제공 할 수 있습니까? 원래 Swift 2.2 코드. –

+0

@EricD 아니요; 이 오류는 빌드/실행 전에 나타납니다. – atirit

답변

7

는이 같은 뭔가 일을해야한다고 생각 : NSFileSize 이후

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

내가 원시 값을 대체 한 단지 상수 문자열했다. 그것은 괜찮은 것 같습니다 -하지만 당연히 공식적인 동등한 것을 찾는 것이 더 낫습니다. (지금은 관리하지 못했기 때문에이 솔루션을 당연하게 생각하지 마십시오. 단지 해결책 일뿐입니다). 엑스 코드 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 그러나이 문서는 없습니다. 아직 스위프트 3으로 업데이트되었습니다. – Moritz

+0

NSFileSize.rawValue는 상수 이름이 실제 문자열과 동일하다는 보장이 없으므로 더 나은 결과를 얻을 것이라고 생각합니다. – rudy

+0

@rudy 하드 코딩 된 값에 대해서 맞습니다. 나는 내 대답을 우습게 만들었다. – Moritz

1

:있는 NSDictionary에 속성을 캐스팅함으로써

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

많은 내장 방법() .fileSize을 포함하여 사용할 수있게 :

    다음 업데이트 된 예제
  • .fileGroupOwnerAccountName()
  • .fileModificationDate()
  • .fileSystemNumber()
  • .fileType()

그것은 그들을 검사하여 반환 데이터 유형을 발견하기 쉽게

  • .fileSystemFileNumber()
  • .fileSize()
  • .filePosixPermissions()
  • 스위프트에서 옵션을 클릭합니다.

    1

    이 호출에서 반환 사전에 작동합니다

    fileAttributes[FileAttributeKey.size.rawValue] 
    

    나는 운동장에서이 오류가 발생하지 않는