2015-11-14 2 views
2

Я пытаюсь преобразовать старое быстрое приложение в 2.0 и, похоже, не может пройти мимо этого фрагмента кода в этой функции:Swift 2.0 - «Невозможно преобразовать возвращаемое выражение типа« NSURL », чтобы вернуть тип« String »

func documentsPathForFileName(name: String) -> String { 

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

    let path = paths[0] ; 

    let fullPath = NSURL(fileURLWithPath: NSTemporaryDirectory()).URLByAppendingPathComponent(name) 

    return fullPath 

} 

на линии «пусть FULLPATH» Я получаю сообщение об ошибке «не удается преобразовать возвращаемое выражение типа„NSURL“для возвращения типа" Строка»

Вот полный .swift файл:

import UIKit 

class CardViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate, UIScrollViewDelegate { 

@IBOutlet weak var SecondCaptureButton: UIBarButtonItem! 

@IBOutlet weak var imageView: UIImageView! 

@IBOutlet weak var OpenButton: UIBarButtonItem! 

@IBOutlet weak var MainCaptureButton: UIButton! 

var imagePicker: UIImagePickerController! 

/* func supportedInterfaceOrientations() -> Int { 
    return Int(UIInterfaceOrientationMask.Portrait.rawValue) 
    } */ 


    override func shouldAutorotate() -> Bool { 
     return false 
    } 

    override func viewDidLoad() { 
    super.viewDidLoad() 

    OpenButton.target = self.revealViewController() 
    OpenButton.action = Selector("revealToggle:") 

    self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer()) 

    MainCaptureButton.layer.borderColor = UIColor.blackColor().CGColor 
    MainCaptureButton.layer.cornerRadius = 10 
    MainCaptureButton.layer.borderWidth = 1 
    MainCaptureButton.titleLabel?.textAlignment = NSTextAlignment.Center 

    let possibleOldImagePath = NSUserDefaults.standardUserDefaults().objectForKey("path") as! String? 

    if let oldImagePath = possibleOldImagePath { 

     let oldFullPath = self.documentsPathForFileName(oldImagePath) 

     let oldImageData = NSData(contentsOfFile: oldFullPath) 

     // here is your saved image: 

     if let oldImage = UIImage(data: oldImageData!) { 

      imageView.image = oldImage 
      print("Old Photo Retrieved") 

      self.view.bringSubviewToFront(imageView) 

     } 

    } 
} 

func documentsPathForFileName(name: String) -> String { 

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

    let path = paths[0] ; 

    let fullPath = NSURL(fileURLWithPath: NSTemporaryDirectory()).URLByAppendingPathComponent(name) 

    return fullPath 

} 

@IBAction func TakePhoto(sender: AnyObject) { 
    imagePicker = UIImagePickerController() 
    imagePicker.delegate = self 
    imagePicker.sourceType = .Camera 

    presentViewController(imagePicker, animated: true, completion: nil) 

} 

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { 
    imagePicker.dismissViewControllerAnimated(true, completion: nil) 
    self.view.sendSubviewToBack(MainCaptureButton) 
    imageView.image = info[UIImagePickerControllerOriginalImage] as? UIImage 

    let imageData = UIImageJPEGRepresentation(imageView.image!, 1) 
    let relativePath = "image_\(NSDate.timeIntervalSinceReferenceDate()).jpg" 
    let path = self.documentsPathForFileName(relativePath) 

    imageData!.writeToFile(path, atomically: true) 

    NSUserDefaults.standardUserDefaults().setObject(relativePath, forKey: "path") 
    NSUserDefaults.standardUserDefaults().synchronize() 

    print("New Photo Saved") 


} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 

} 

} 
+0

NSURL (...) возвращает объект NSURL, а не String – user3441734

ответ

2

Ваш метод определяется как возвращать строку:

func documentsPathForFileName(name: String) -> String { ... 

но вы пытаетесь вернуть NSURL. Вы можете либо изменить подпись метода вернуть NSURL:

func documentsPathForFileName(name: String) -> NSURL { ... 

или вы могли бы вернуть строковое представление URL:

return fullPath.absoluteString 
+0

'absoluteString' не подходит в этом случае, потому что он возвращает также ведущую схему' файл: // ' – vadian

1

сообщения об ошибке очень ясно.

fullPath является NSURL экземпляр, возвращаемое значение String

Либо изменить возвращаемое значение

func documentsPathForFileName(name: String) -> NSURL { 
    let fullPath = NSURL(fileURLWithPath: NSTemporaryDirectory()).URLByAppendingPathComponent(name) 
    return fullPath 
} 

Или возвращать строку

func documentsPathForFileName(name: String) -> String { 
    let fullPath = NSTemporaryDirectory().stringByAppendingPathComponent(name) 
    return fullPath 
} 

Я опущена локальную переменную path, потому что это не используется в фрагменте.

Смежные вопросы