最近Swiftに触り始めたのですが、癖でコピペをしてしまい、コードが複雑になってしまいました。
コードを丸投げするのは良くないと思うのですが、ここからパースした情報をTableViewに追加しようとして複雑になったコードのせいで足止めをくらってしまい、申し訳ないのですが、悪い点直したほうがいい点を教えてくださると助かります。
このアプリでやりたいことはバーコードリーダーで書籍のISBNを読み取り、楽天書籍検索apiを使って、帰って来たデータや画像をTableViewに追加するというものです、
最終的にはそのデータをExcelやスプレットシートに書き出せたらと思っています
swift2
1//barcode.swift 2import UIKit 3import AVFoundation 4 5final class Barcode: UIViewController, UITableViewDelegate{ 6 7 8 @IBOutlet weak var tableView: UITableView! 9 @IBOutlet weak var captureView: UIView? 10 private lazy var captureSession: AVCaptureSession = AVCaptureSession() 11 private lazy var captureDevice: AVCaptureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo) 12 private lazy var capturePreviewLayer: AVCaptureVideoPreviewLayer = { 13 let layer = AVCaptureVideoPreviewLayer(session: self.captureSession) 14 return layer 15 }() 16 17 private var captureInput: AVCaptureInput? = nil 18 private lazy var captureOutput: AVCaptureMetadataOutput = { 19 let output = AVCaptureMetadataOutput() 20 output.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue()) 21 return output 22 }() 23 24 override func viewDidLoad() { 25 super.viewDidLoad() 26 27 // Do any additional setup after loading the view, typically from a nib. 28 setupBarcodeCapture() 29 } 30 31 override func viewDidLayoutSubviews() { 32 super.viewDidLayoutSubviews() 33 capturePreviewLayer.frame = self.captureView?.bounds ?? CGRectZero 34 } 35 36 override func didReceiveMemoryWarning() { 37 super.didReceiveMemoryWarning() 38 // Dispose of any resources that can be recreated. 39 } 40 41 // MARK: - private 42 private func setupBarcodeCapture() { 43 do { 44 captureInput = try AVCaptureDeviceInput(device: captureDevice) 45 captureSession.addInput(captureInput) 46 captureSession.addOutput(captureOutput) 47 captureOutput.metadataObjectTypes = captureOutput.availableMetadataObjectTypes 48 capturePreviewLayer.frame = self.captureView?.bounds ?? CGRectZero 49 capturePreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill 50 captureView?.layer.addSublayer(capturePreviewLayer) 51 captureSession.startRunning() 52 } catch let error as NSError { 53 print(error) 54 } 55 } 56 57 private func convartISBN(value: String) -> String? { 58 let v = NSString(string: value).longLongValue 59 let prefix: Int64 = Int64(v / 10000000000) 60 guard prefix == 978 || prefix == 979 else { return nil } 61 let isbn9: Int64 = (v % 10000000000) / 10 62 var sum: Int64 = 0 63 var tmpISBN = isbn9 64 /* 65 for var i = 10; i > 0 && tmpISBN > 0; i -= 1 { 66 let divisor: Int64 = Int64(pow(10, Double(i - 2))) 67 sum += (tmpISBN / divisor) * Int64(i) 68 tmpISBN %= divisor 69 } 70 */ 71 72 var i = 10 73 while i > 0 && tmpISBN > 0 { 74 let divisor: Int64 = Int64(pow(10, Double(i - 2))) 75 sum += (tmpISBN / divisor) * Int64(i) 76 tmpISBN %= divisor 77 i -= 1 78 } 79 80 let checkdigit = 11 - (sum % 11) 81 return String(format: "%lld%@", isbn9, (checkdigit == 10) ? "X" : String(format: "%lld", checkdigit % 11)) 82 } 83 func imageview(img:String){ 84 guard let urlurl = NSURL(string:img)else { 85 print("nill") 86 return 87 } 88 let req = NSURLRequest(URL:urlurl) 89 //非同期で変換 90 NSURLConnection.sendAsynchronousRequest(req, queue:NSOperationQueue.mainQueue()){(res, data, err) in 91 let image = UIImage(data:data!) 92 93 } 94 } 95} 96 97 98extension Barcode: AVCaptureMetadataOutputObjectsDelegate { 99 100 func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) { 101 self.captureSession.stopRunning() 102 guard let objects = metadataObjects as? [AVMetadataObject] else { return } 103 var detectionString: String? = nil 104 let barcodeTypes = [AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeEAN13Code] 105 for metadataObject in objects { 106 loop: for type in barcodeTypes { 107 guard metadataObject.type == type else { continue } 108 guard self.capturePreviewLayer.transformedMetadataObjectForMetadataObject(metadataObject) is AVMetadataMachineReadableCodeObject else { continue } 109 if let object = metadataObject as? AVMetadataMachineReadableCodeObject { 110 detectionString = object.stringValue 111 break loop 112 } 113 } 114 var text = "" 115 guard let value = detectionString else { continue } 116 text += "読み込んだ値:\t\(value)" 117 text += "\n" 118 guard let isbn = convartISBN(value) else { continue } 119 text += "ISBN:\t\(isbn)" 120 121 let urlString:String = "https://app.rakuten.co.jp/services/api/BooksBook/Search/20130522?format=json&booksGenreId=001&sort=sales&applicationId=(アプリケーションID)&isbn=\(isbn)" 122 guard let url = NSURL(string: urlString)else { 123 print("nil") 124 continue 125 } 126 //アクセスするタスクを実行 127 let task = NSURLSession.sharedSession().dataTaskWithURL(url){ 128 129 //渡ってくる変数群。重要なデータは文字通りdataの中に 130 (data,response,error) in 131 132 //中身が入っているかどうかをフィルタリング 133 guard let data = data else{return} 134 135 //dataを扱いやすいようにJSON化 136 let json = JSON(data: data) 137 138 let title = json["Items"][0]["Item"]["title"].stringValue 139 let author = json["Items"][0]["Item"]["author"].stringValue 140 let salesDate = json["Items"][0]["Item"]["salesDate"].stringValue 141 let Image = json["Items"][0]["Item"]["mediumImageUrl"].stringValue 142 let company = json["Items"][0]["Item"]["publisherName"].stringValue 143 144 self.imageview(Image) 145 } 146 task.resume() 147 } 148 self.captureSession.startRunning() 149 } 150 151}
よろしくお願いいたします
SwftyJSON
XCODE7
Swift2
あなたの回答
tips
プレビュー