質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Xcode 7

Xcode 7は、ソフトウェア開発のためのアップルの統合開発環境であるXcodeのバージョン。UIを作成するために用いるグラフィカルツールです。iOS9/OS X El Capitan/watchOS2に対応。Swift 2コンパイラーが搭載されています。

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

0回答

1505閲覧

JSONで返って来たデータをTableViewに追加したい、コードの複雑化

kurotan217

総合スコア16

Xcode 7

Xcode 7は、ソフトウェア開発のためのアップルの統合開発環境であるXcodeのバージョン。UIを作成するために用いるグラフィカルツールです。iOS9/OS X El Capitan/watchOS2に対応。Swift 2コンパイラーが搭載されています。

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/07/03 01:29

編集2022/01/12 10:55

最近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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問