teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

テストコードの追加

2017/09/29 06:41

投稿

Fushihara
Fushihara

スコア52

title CHANGED
File without changes
body CHANGED
@@ -22,4 +22,75 @@
22
22
  そこで、既定のPuプロトコルにNSObject,NSCodingの継承を追加しようとしたのですが
23
23
  NSObjectはクラスですので「Non-class type 'Pu' cannot inherit from class 'NSObject'」というエラーが出てしまいました。
24
24
  Puをプロトコルからクラスに変えるのが本来あるべき対処法かと思うのですが、PuをクラスにするとhogeFuncを実装する強制を持たせる事が出来ませんし、すでにあちこちでPuを参照しているコード、型の変数があり変更箇所を可能な限り少なくしたいです。
25
- 修正範囲をなるべく狭くしたいという理由で、PuをプロトコルのままでNSObjectを継承させるにはどうしたらよろしでしょうか。
25
+ 修正範囲をなるべく狭くしたいという理由で、PuをプロトコルのままでNSObjectを継承させるにはどうしたらよろしでしょうか。
26
+
27
+
28
+ 具体的なコードは以下のような内容です。以下のP_C_BはNSObjectを継承していないので、シリアライズ化の時に落ちてしまいます。
29
+ protocol Puで、どうにかして「NSObjectを継承する」という制約を付けれればよいのですが。
30
+
31
+ ```swift
32
+ protocol Pu : NSCoding{
33
+ func test() -> String
34
+ }
35
+ class P_C_A : NSObject, Pu {
36
+ private let pca : String
37
+ func test() -> String {
38
+ return "T_C_A"
39
+ }
40
+ override init(){
41
+ self.pca = "a"
42
+ super.init()
43
+ }
44
+ required public init?(coder aDecoder: NSCoder) {
45
+ self.pca = aDecoder.decodeObject(forKey: "pca") as! String
46
+ }
47
+ func encode(with aCoder: NSCoder) {
48
+ aCoder.encode(self.pca, forKey: "pca")
49
+ }
50
+ }
51
+ class P_C_B : Pu {
52
+ private let pcb : String
53
+ init(){
54
+ self.pcb = "b"
55
+ }
56
+ func encode(with aCoder: NSCoder) {
57
+ aCoder.encode(self.pcb, forKey: "pcb")
58
+ }
59
+ required init?(coder aDecoder: NSCoder) {
60
+ self.pcb = aDecoder.decodeObject(forKey: "pcb") as! String
61
+ }
62
+ func test() -> String {
63
+ return "T_C_A"
64
+ }
65
+ }
66
+ class S_t2 {
67
+ static func extTest(){
68
+ let v1 : [Pu] = [
69
+ P_C_A(),
70
+ P_C_B()
71
+ ]
72
+ let v2 : Data = NSKeyedArchiver.archivedData(withRootObject: v1)
73
+ let v3 : String = v2.base64EncodedString()
74
+ let v4 : Data = Data(base64Encoded: v3)!
75
+ let v5 : Any = NSKeyedUnarchiver.unarchiveObject(with: v4)!
76
+ let v6 : [Pu] = NSKeyedUnarchiver.unarchiveObject(with: v4) as! [Pu]
77
+
78
+ v6.forEach { (i) in
79
+ if let d = i as? P_C_A {
80
+ print("これはPCAです")
81
+ }else if let d = i as? P_C_B {
82
+ print("これはPCBです")
83
+ }else{
84
+ print("型の判定に失敗しました")
85
+ }
86
+ }
87
+ print(v1)
88
+ print(v2)
89
+ print(v3)
90
+ print(v4)
91
+ print(v5)
92
+ print(v6)
93
+ }
94
+ }
95
+ S_t2.extTest()
96
+ ```

1

やらない理由追加

2017/09/29 06:41

投稿

Fushihara
Fushihara

スコア52

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