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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

290閲覧

collectionを継承したstructの値を変更する方法

hameji

総合スコア1380

Swift

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2019/10/27 15:04

編集2019/10/27 15:54

tableViewなどのcellの型をenumで作成し、
Dataをassociated valueで持たせている時、
その並びをcustom struct(collectionを継承)で定義しようと思っています。

そこで、その値を変更するcustom funcを設定する時、
配列のindexをintで指定できなくて困っています。
PresentCell「.name」を忘れてて、修正したら、違うエラーとなりましたので、
変更しました。

サンプルコードを作って試しています。
下記のコードを見てもらった方が早いと思います。

Swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 // Do any additional setup after loading the view. 8 9 let cells = TempCells() 10 print(cells[0] as! PresentCell) // これは動く 11 print(cells[1] as! PresentCell) // これも動く 12 print(cells[2] as! PresentCell) // そしてこれも大丈夫 13 cells.rewriteName(firstName: "大阪", lastName: "次郎") // これを実行したい 14 } 15} 16 17struct TempCells: Collection { 18 typealias _Element = PresentCell 19 typealias Index = Int 20 21 var startIndex: Int { return 0 } 22 var endIndex: Int { return limit } 23 let limit: Int = 2 24 25 subscript(position: Int) -> _Element { 26 precondition((startIndex...endIndex) ~= position, "Index out of bounds.") 27 switch position { 28 case 0: return PresentCell.name(NameData(firstName: "東京", lastName: "太郎")) 29 case 1: return PresentCell.birthday(DateData(date: Date().addingTimeInterval(-60*60*24*365*20).timeIntervalSince1970)) 30 case 2: return PresentCell.university(SchoolData(university: "東京大学")) 31 default: return PresentCell.none 32 } 33 } 34 35 func index(after i: Int) -> Int { 36 precondition(i < endIndex, "Can't advance beyond endIndex") 37 return i + 1 38 } 39 40 func rewriteName(firstName: String, lastName: String) -> TempCells { 41 var tempCells = TempCells() 42 tempCells[0] = PresentCell.name(NameData(firstName: firstName, lastName: lastName)) // <-この行で[0]のとこがIntでは指定できませんというエラーが返ってきて詰まっています。 43 return tempCells 44 } 45 46} 47 48enum PresentCell { 49 case name(NameData) 50 case birthday(DateData) 51 case university(SchoolData) 52 case none 53} 54 55struct NameData { 56 let firstName: String 57 let lastName: String 58} 59 60struct DateData { 61 let date: Double 62} 63 64struct SchoolData { 65 let university: String 66}

解決できる指定方法をご教授いただけると幸いです。

イメージ説明

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

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

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

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

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

guest

回答1

0

自己解決

~~まだ途中ですが、~~どうもCollection継承だとgetしかできないみたいなので、

setも利用するにはMutableCollectionを継承する

に変更しないといけないみたいです。

そのように変更し、試行錯誤中です。
書き換え途中ですが、やはり詰まってしまいました。

stackOverflowでいいサンプル

があり、最終的に以下のコードで実現できました。

var cells = TempCells()をより構造的に強固なletで定義したかったですが、
そうすると、メンバ変数にできないので、無理みたいなので、これで解決とします。

Swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 // Do any additional setup after loading the view. 8 9 var cells = TempCells() 10 print("old", cells.description) 11 cells.rewriteName(firstName: "大阪", lastName: "太郎") 12 print("new", cells.description) 13 } 14} 15 16struct TempCells: MutableCollection { 17 var cells: [PresentCell] = [] 18 19 init() { 20 self.cells = [PresentCell.name(NameData(firstName: "東京", lastName: "太郎")), 21 PresentCell.birthday(DateData(date: Date().addingTimeInterval(-60*60*24*365*20).timeIntervalSince1970)), 22 PresentCell.university(SchoolData(university: "東京大学"))] 23 } 24 25 var description: String { return cells.description } 26 var startIndex: Int { return 0 } 27 var endIndex: Int { return cells.count } 28 29 func index(after i: Int) -> Int { return i + 1 } 30 31 subscript(position: Int) -> PresentCell { 32 get { return cells[position] } 33 set(newValue) { cells[position] = newValue } 34 } 35 36 mutating func rewriteName(firstName: String, lastName: String) { 37 self[0] = PresentCell.name(NameData(firstName: firstName, lastName: lastName)) 38 } 39}

イメージ説明

投稿2019/10/27 16:06

編集2019/10/27 17:33
hameji

総合スコア1380

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問