質問編集履歴

2

テストコードの追加

2017/09/29 06:41

投稿

Fushihara
Fushihara

スコア52

test CHANGED
File without changes
test CHANGED
@@ -47,3 +47,145 @@
47
47
  Puをプロトコルからクラスに変えるのが本来あるべき対処法かと思うのですが、PuをクラスにするとhogeFuncを実装する強制を持たせる事が出来ませんし、すでにあちこちでPuを参照しているコード、型の変数があり変更箇所を可能な限り少なくしたいです。
48
48
 
49
49
  修正範囲をなるべく狭くしたいという理由で、PuをプロトコルのままでNSObjectを継承させるにはどうしたらよろしでしょうか。
50
+
51
+
52
+
53
+
54
+
55
+ 具体的なコードは以下のような内容です。以下のP_C_BはNSObjectを継承していないので、シリアライズ化の時に落ちてしまいます。
56
+
57
+ protocol Puで、どうにかして「NSObjectを継承する」という制約を付けれればよいのですが。
58
+
59
+
60
+
61
+ ```swift
62
+
63
+ protocol Pu : NSCoding{
64
+
65
+ func test() -> String
66
+
67
+ }
68
+
69
+ class P_C_A : NSObject, Pu {
70
+
71
+ private let pca : String
72
+
73
+ func test() -> String {
74
+
75
+ return "T_C_A"
76
+
77
+ }
78
+
79
+ override init(){
80
+
81
+ self.pca = "a"
82
+
83
+ super.init()
84
+
85
+ }
86
+
87
+ required public init?(coder aDecoder: NSCoder) {
88
+
89
+ self.pca = aDecoder.decodeObject(forKey: "pca") as! String
90
+
91
+ }
92
+
93
+ func encode(with aCoder: NSCoder) {
94
+
95
+ aCoder.encode(self.pca, forKey: "pca")
96
+
97
+ }
98
+
99
+ }
100
+
101
+ class P_C_B : Pu {
102
+
103
+ private let pcb : String
104
+
105
+ init(){
106
+
107
+ self.pcb = "b"
108
+
109
+ }
110
+
111
+ func encode(with aCoder: NSCoder) {
112
+
113
+ aCoder.encode(self.pcb, forKey: "pcb")
114
+
115
+ }
116
+
117
+ required init?(coder aDecoder: NSCoder) {
118
+
119
+ self.pcb = aDecoder.decodeObject(forKey: "pcb") as! String
120
+
121
+ }
122
+
123
+ func test() -> String {
124
+
125
+ return "T_C_A"
126
+
127
+ }
128
+
129
+ }
130
+
131
+ class S_t2 {
132
+
133
+ static func extTest(){
134
+
135
+ let v1 : [Pu] = [
136
+
137
+ P_C_A(),
138
+
139
+ P_C_B()
140
+
141
+ ]
142
+
143
+ let v2 : Data = NSKeyedArchiver.archivedData(withRootObject: v1)
144
+
145
+ let v3 : String = v2.base64EncodedString()
146
+
147
+ let v4 : Data = Data(base64Encoded: v3)!
148
+
149
+ let v5 : Any = NSKeyedUnarchiver.unarchiveObject(with: v4)!
150
+
151
+ let v6 : [Pu] = NSKeyedUnarchiver.unarchiveObject(with: v4) as! [Pu]
152
+
153
+
154
+
155
+ v6.forEach { (i) in
156
+
157
+ if let d = i as? P_C_A {
158
+
159
+ print("これはPCAです")
160
+
161
+ }else if let d = i as? P_C_B {
162
+
163
+ print("これはPCBです")
164
+
165
+ }else{
166
+
167
+ print("型の判定に失敗しました")
168
+
169
+ }
170
+
171
+ }
172
+
173
+ print(v1)
174
+
175
+ print(v2)
176
+
177
+ print(v3)
178
+
179
+ print(v4)
180
+
181
+ print(v5)
182
+
183
+ print(v6)
184
+
185
+ }
186
+
187
+ }
188
+
189
+ S_t2.extTest()
190
+
191
+ ```

1

やらない理由追加

2017/09/29 06:41

投稿

Fushihara
Fushihara

スコア52

test CHANGED
File without changes
test CHANGED
@@ -44,6 +44,6 @@
44
44
 
45
45
  NSObjectはクラスですので「Non-class type 'Pu' cannot inherit from class 'NSObject'」というエラーが出てしまいました。
46
46
 
47
- Puをプロトコルからクラスに変えるのが本来あるべき対処法かと思うのですが、すでにあちこちでPuを使った処理書かれてお
47
+ Puをプロトコルからクラスに変えるのが本来あるべき対処法かと思うのですが、PuをクラスにるとhogeFuncを実装する強制を持たせる事が出来ませんし、すでにあちこちでPuを参照しているコード、型の変数変更箇所を可能な限り少なくしたいです。
48
48
 
49
49
  修正範囲をなるべく狭くしたいという理由で、PuをプロトコルのままでNSObjectを継承させるにはどうしたらよろしでしょうか。