2016-12-22 1 views
2

iOS/Swift에 처음 오셨습니까? 내가 스위프트 2에서 스위프트 3. 원래 코드 (단순히 NSData init() 방법을 통해 URL의 내용을 반입하는) 프로젝트를 마이그레이션하려고하면 다음과 같습니다NSData init? (contentsOf url : URL) Swift 2에서 Swift 3로 마이그레이션

let loadedImageData = NSData(contentsOfURL: imageURL) 
      dispatch_async(dispatch_get_main_queue()) { 
       if imageURL == user.profileImageURL { 
        if let imageData = loadedImageData { 
         self.profileImageView?.image = UIImage(data: imageData) 
        } 
       } 
      } 

스위프트 3 마이그레이션 :

let loadedImageData = NSData(contentsOf: imageURL as URL) 
      DispatchQueue.main.async { 
       if imageURL == user.profileImageURL { 
        if let imageData = loadedImageData { 
         self.profileImageView?.image = UIImage(data: imageData as Data) 
        } 
       } 
      } 

NSData 반환 값을 URL으로 캐스팅하고 Swift 3 내에서 이미지를로드하는 동안 해당 반환 값을 Data 유형으로 다시 캐스팅해야하는 이유가 확실하지 않습니다. 둘 다 원시 데이터를 변수 loadedImageData에 할당합니다 버전. 그럼 왜 캐스팅? UIImage init() 메서드는 Swift 3 내에서 데이터 개체가 필요합니다. Swift 2의 경우에는 동일한 개체가 없습니다. 왜 그런가요?

도움 주셔서 감사합니다.

답변

6

마이그레이션은 해당 방법의 서명, 즉 그들이 수락하는 유형의 일부 변경으로 구성됩니다.

스위프트 2에서 NSData(contentsOfURL:)UIImage(data:)은 각각 NSURLNSData입니다.

현재, 그들은 NSData(contentsOf:)UIImage(data:) 각각 동의 URL (struct)와 Data (대신 NSData)로 변경되었습니다; 결과적으로 대신 URL 유형의 URL을 구성하지 않은 경우 형 변환이 필요합니다.

대신 캐스팅을 피하려면 Data(contentsOf: URL)을 사용할 수 있습니다.

+0

아하하 .. URL은 실제로 선택적인 NSUrl 변수로 구축되고 있습니다. 말이 맞습니다. swift 2.0 API 및 해당 변경 사항에 대한 설명서는 어디에서 찾을 수 있습니까? https://developer.apple.com/reference/foundation/nsdata를 참조하고 있습니다. 그러나 이것은 2.0에서 3.0까지의 init 메소드의 변경 사항을 보여주지 않습니다. 감사!! – user2511882

+0

@ user2511882 여러분을 환영합니다. 해피 홀리데이. – Unheilig

관련 문제