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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

520閲覧

Swift 配列の中に配列を入れるのではなく,配列の要素だけ追加したい

maru.wk

総合スコア30

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2018/01/12 03:31

###前提・実現したいこと
配列dataArrayに関数の戻り値である配列の中身の要素だけ追加したいです。
下記のcreateRGB(x1: Int,y1: Int) -> [UInt8]を使用し,戻り値である[r,g,b]を配列dataArrayに追加する際に,dataArray = [[r,g,b]...]ではなく,dataArray = [r,g,b,...]としたいです。
###発生している問題・エラーメッセージ
関数の戻り値で配列を指定しており,dataArrayに追加するには,dataArrayを多次元配列とすることしか自分では思いつかなかった。しかし,dataArrayは普通の配列である必要があり,どうすればよいかわからず困っています。
###該当のソースコード

swift

1class ViewController: UIViewController { 2 var dataArray = [UInt8]() 3... 4override func viewDidLoad() { 5 super.viewDidLoad() 6 // Do any additional setup after loading the view, typically from a nib. 7 8 do{ 9 let image = #imageLiteral(resourceName: "IMG_1758").cgImage 10 if let data1 = Transformation.init(inputImage: image!, OutSizeX: 3024, OutSizeY: 4032, Theta2: 75.0) { 11 for y in 0...4032{ 12 for x in 0...3024{ 13 dataArray.append(data1.createRGB(x1: x, y1: y)) 14 } 15 } 16 } 17 } 18 } 19 20//入力画像から出力画像のRGB配列を作成するクラス 21 class Transformation { 22 //変数の設定 23 var outSizeX : Int 24 var outSizeY : Int 25 var pixelData : Data 26 var bytesPerRow : Int 27 let bytesPerPixel = 4 28 var RGB : [UInt8] 29 var theta2 : Double 30 var tanTheta : Double 31 var dIn : Double 32 var fIn : Double 33 var dOut : Double 34 var fOut : Double 35 var InCenterX : Double 36 var InCenterY : Double 37 var outCenterX : Double 38 var outCenterY : Double 39 var inputImage1 : CGImage 40 41 var width : Int 42 var height : Int 43 44 45 //変数の初期値を定める 46 init? (inputImage: CGImage, OutSizeX : Int, OutSizeY : Int, Theta2 : Double) { 47 outSizeX = OutSizeX 48 outSizeY = OutSizeY 49 pixelData = inputImage.dataProvider!.data! as Data 50 bytesPerRow = inputImage.bytesPerRow 51 RGB = [] 52 theta2 = Theta2 53 tanTheta = tan(0.5*theta2*(Double.pi)/180) 54 dIn = 0.5*sqrt(pow(Double(inputImage.width),2) + pow(Double(inputImage.height), 2)) 55 fIn = dIn / tanTheta 56 dOut = 0.5*sqrt(pow(Double(outSizeX),2) + pow(Double(outSizeY), 2)) 57 fOut = 2*dOut / M_PI 58 inputImage1 = inputImage 59 InCenterX = 0.5*Double(inputImage.width) 60 InCenterY = 0.5*Double(inputImage.height) 61 outCenterX = 0.5*Double(outSizeX) 62 outCenterY = 0.5*Double(outSizeY) 63 64 pixelData = inputImage.dataProvider!.data! as Data 65 width = inputImage.width 66 height = inputImage.height 67 bytesPerRow = inputImage.bytesPerRow 68 69 guard outSizeX>0, outSizeY>0 else { return nil } 70 } 71 //出力画像のRGB配列を作成する関数 72 func createRGB(x1: Int,y1: Int) -> [UInt8]{ 73 //変数の定義 74 var yOutX : Double 75 var yOutY : Double 76 var yOut : Double 77 var inPixelI : Int 78 var inPixelJ : Int 79 var yIn : Double 80 var scale : Double 81 // var rgb : [UInt8] 82 83 //全ピクセルに対して処理を行う 84 for y in 0..<y1{ 85 for x in 0..<x1{ 86 87 //出力画像の中心座標から任意のピクセルまでの距離 88 yOutX = Double(x) - outCenterX + 0.5 89 yOutY = Double(y) - outCenterY + 0.5 90 yOut = sqrt(pow(yOutX,2) + pow(yOutY,2)) 91 92 93 //yOutの値から,条件分岐 94 if yOut == 0 { 95 inPixelI = Int(round(InCenterX-0.5)) 96 inPixelJ = Int(round(InCenterY-0.5)) 97 //求めた入力画像の座標におけるピクセルのRGB情報を,出力画像のピクセルのRGB情報に上書き 98 let pixelInfo: Int = (Int(bytesPerRow) * inPixelJ + inPixelI * 4) 99 let r = UInt8(pixelData[pixelInfo]) 100 let g = UInt8(pixelData[pixelInfo+1]) 101 let b = UInt8(pixelData[pixelInfo+2]) 102 103 RGB.append(r) 104 RGB.append(g) 105 RGB.append(b) 106 107 108 return (RGB) 109 110 111 112 }else { 113 //射影変換を行い,出力画像でのyOutが入力画像ではどのような値になるか調べる 114 yIn = fIn*tan(yOut/fOut) 115 scale = yIn / yOut 116 //yInから,出力画像の任意のピクセルに対応する,入力画像のピクセルの座標を調べる 117 inPixelI = Int(round(yOutX*scale + InCenterX - 0.5)) 118 inPixelJ = Int(round(yOutY*scale + InCenterY - 0.5)) 119 //入力画像のピクセルのRGB情報を得る 120 121 if (inPixelI < Int(x1)) && (inPixelJ < Int(y1)) { 122 let pixelInfo: Int = (Int(bytesPerRow) * inPixelJ + inPixelI * 4) 123 let r = UInt8(pixelData[pixelInfo]) 124 let g = UInt8(pixelData[pixelInfo+1]) 125 let b = UInt8(pixelData[pixelInfo+2]) 126 127 RGB.append(r) 128 RGB.append(g) 129 RGB.append(b) 130 131 return RGB 132 133 }else { 134 let y:UInt8 = 0 135 let r = UInt8(0) 136 let g = UInt8(0) 137 let b = UInt8(0) 138 139 RGB.append(r) 140 RGB.append(g) 141 RGB.append(b) 142 return RGB 143 144 } 145 } 146 } 147 return ([0]) 148 } 149 150 151} 152

###試したこと
戻り値をタプルとしたり,多次元配列を普通の配列に直せないか調べたのですがうまくいきませんでした。

###補足情報(言語/FW/ツール等のバージョンなど)
swift3.0

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

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

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

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

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

guest

回答1

0

ベストアンサー

配列に要素を追加するため機能には、appendメソッドのように追加すべき要素を一つ指定するものだけでなく複数の要素(つまり配列)どうしを連結させることもできます。

swfit

1var da: [Int] = [1, 2] 2let a1: [Int] = [3, 4] 3 4da += a1 5print(da) // [1, 2, 3, 4]

こうした機能は「swift 配列 連結」といったそれらしいキーワードを指定して検索すれば大抵見つけられると思います。

投稿2018/01/12 03:40

KSwordOfHaste

総合スコア18394

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

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

maru.wk

2018/01/12 03:42

連結ということが可能なのですね!霧が晴れた気分です! これからやってみます。ありがとうございました。
maru.wk

2018/01/12 03:53

すみません。for文のループの中で増えていく配列を連結させるのはどうすれば良いのでしょうか?;
KSwordOfHaste

2018/01/12 03:53

まあ・・・あるあるな質問はどうしても重なるということなのでしょうw teratailで見つけられるぐらいなら普通にググれば見つかるはずですから、どういうキーワードを指定するか最初はわからないという点が一つの壁なのだろうと思います。 適当にあたりを付けて「swift 配列 くっつける」でもヒットするかも知れません!やっているうちにだんだんしかるべき「用語」がわかってくると思いますが、そうなれば検索もやりやすくなるだろうと思います。
KSwordOfHaste

2018/01/12 03:55

for ループの中でもそうでなくても同じで大丈夫と思いますよ。肝心な点は配列変数を更新するのでletとはかけず、varで宣言しなければならない点とか配列の要素の型を合わせるといった点だと思います。そこさえ押さえておけばその変数がアクセスできる場所ならどこででも自由に dataArray += くっつけたいもの と書けますよ。
maru.wk

2018/01/12 04:48

すみません。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問