SwiftTestObjects.swift 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593
  1. ////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright 2014 Realm Inc.
  4. //
  5. // Licensed under the Apache License, Version 2.0 (the "License");
  6. // you may not use this file except in compliance with the License.
  7. // You may obtain a copy of the License at
  8. //
  9. // http://www.apache.org/licenses/LICENSE-2.0
  10. //
  11. // Unless required by applicable law or agreed to in writing, software
  12. // distributed under the License is distributed on an "AS IS" BASIS,
  13. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. // See the License for the specific language governing permissions and
  15. // limitations under the License.
  16. //
  17. ////////////////////////////////////////////////////////////////////////////
  18. import Foundation
  19. import RealmSwift
  20. import Realm
  21. class SwiftStringObject: Object {
  22. @objc dynamic var stringCol = ""
  23. }
  24. class SwiftBoolObject: Object {
  25. @objc dynamic var boolCol = false
  26. }
  27. class SwiftIntObject: Object {
  28. @objc dynamic var intCol = 0
  29. }
  30. class SwiftLongObject: Object {
  31. @objc dynamic var longCol: Int64 = 0
  32. }
  33. @objc enum IntEnum: Int, RealmEnum {
  34. case value1 = 1
  35. case value2 = 3
  36. }
  37. class SwiftObject: Object {
  38. @objc dynamic var boolCol = false
  39. @objc dynamic var intCol = 123
  40. @objc dynamic var intEnumCol = IntEnum.value1
  41. @objc dynamic var floatCol = 1.23 as Float
  42. @objc dynamic var doubleCol = 12.3
  43. @objc dynamic var stringCol = "a"
  44. @objc dynamic var binaryCol = "a".data(using: String.Encoding.utf8)!
  45. @objc dynamic var dateCol = Date(timeIntervalSince1970: 1)
  46. @objc dynamic var objectCol: SwiftBoolObject? = SwiftBoolObject()
  47. let arrayCol = List<SwiftBoolObject>()
  48. class func defaultValues() -> [String: Any] {
  49. return [
  50. "boolCol": false,
  51. "intCol": 123,
  52. "floatCol": 1.23 as Float,
  53. "doubleCol": 12.3,
  54. "stringCol": "a",
  55. "binaryCol": "a".data(using: String.Encoding.utf8)!,
  56. "dateCol": Date(timeIntervalSince1970: 1),
  57. "objectCol": [false],
  58. "arrayCol": []
  59. ]
  60. }
  61. }
  62. class SwiftOptionalObject: Object {
  63. @objc dynamic var optNSStringCol: NSString?
  64. @objc dynamic var optStringCol: String?
  65. @objc dynamic var optBinaryCol: Data?
  66. @objc dynamic var optDateCol: Date?
  67. let optIntCol = RealmOptional<Int>()
  68. let optInt8Col = RealmOptional<Int8>()
  69. let optInt16Col = RealmOptional<Int16>()
  70. let optInt32Col = RealmOptional<Int32>()
  71. let optInt64Col = RealmOptional<Int64>()
  72. let optFloatCol = RealmOptional<Float>()
  73. let optDoubleCol = RealmOptional<Double>()
  74. let optBoolCol = RealmOptional<Bool>()
  75. let optEnumCol = RealmOptional<IntEnum>()
  76. @objc dynamic var optObjectCol: SwiftBoolObject?
  77. }
  78. class SwiftOptionalPrimaryObject: SwiftOptionalObject {
  79. let id = RealmOptional<Int>()
  80. override class func primaryKey() -> String? { return "id" }
  81. }
  82. class SwiftListObject: Object {
  83. let int = List<Int>()
  84. let int8 = List<Int8>()
  85. let int16 = List<Int16>()
  86. let int32 = List<Int32>()
  87. let int64 = List<Int64>()
  88. let float = List<Float>()
  89. let double = List<Double>()
  90. let string = List<String>()
  91. let data = List<Data>()
  92. let date = List<Date>()
  93. let intOpt = List<Int?>()
  94. let int8Opt = List<Int8?>()
  95. let int16Opt = List<Int16?>()
  96. let int32Opt = List<Int32?>()
  97. let int64Opt = List<Int64?>()
  98. let floatOpt = List<Float?>()
  99. let doubleOpt = List<Double?>()
  100. let stringOpt = List<String?>()
  101. let dataOpt = List<Data?>()
  102. let dateOpt = List<Date?>()
  103. }
  104. class SwiftImplicitlyUnwrappedOptionalObject: Object {
  105. @objc dynamic var optNSStringCol: NSString!
  106. @objc dynamic var optStringCol: String!
  107. @objc dynamic var optBinaryCol: Data!
  108. @objc dynamic var optDateCol: Date!
  109. @objc dynamic var optObjectCol: SwiftBoolObject!
  110. }
  111. class SwiftOptionalDefaultValuesObject: Object {
  112. @objc dynamic var optNSStringCol: NSString? = "A"
  113. @objc dynamic var optStringCol: String? = "B"
  114. @objc dynamic var optBinaryCol: Data? = "C".data(using: String.Encoding.utf8)! as Data
  115. @objc dynamic var optDateCol: Date? = Date(timeIntervalSince1970: 10)
  116. let optIntCol = RealmOptional<Int>(1)
  117. let optInt8Col = RealmOptional<Int8>(1)
  118. let optInt16Col = RealmOptional<Int16>(1)
  119. let optInt32Col = RealmOptional<Int32>(1)
  120. let optInt64Col = RealmOptional<Int64>(1)
  121. let optFloatCol = RealmOptional<Float>(2.2)
  122. let optDoubleCol = RealmOptional<Double>(3.3)
  123. let optBoolCol = RealmOptional<Bool>(true)
  124. @objc dynamic var optObjectCol: SwiftBoolObject? = SwiftBoolObject(value: [true])
  125. // let arrayCol = List<SwiftBoolObject?>()
  126. class func defaultValues() -> [String: Any] {
  127. return [
  128. "optNSStringCol": "A",
  129. "optStringCol": "B",
  130. "optBinaryCol": "C".data(using: String.Encoding.utf8)!,
  131. "optDateCol": Date(timeIntervalSince1970: 10),
  132. "optIntCol": 1,
  133. "optInt8Col": 1,
  134. "optInt16Col": 1,
  135. "optInt32Col": 1,
  136. "optInt64Col": 1,
  137. "optFloatCol": 2.2 as Float,
  138. "optDoubleCol": 3.3,
  139. "optBoolCol": true
  140. ]
  141. }
  142. }
  143. class SwiftOptionalIgnoredPropertiesObject: Object {
  144. @objc dynamic var id = 0
  145. @objc dynamic var optNSStringCol: NSString? = "A"
  146. @objc dynamic var optStringCol: String? = "B"
  147. @objc dynamic var optBinaryCol: Data? = "C".data(using: String.Encoding.utf8)! as Data
  148. @objc dynamic var optDateCol: Date? = Date(timeIntervalSince1970: 10)
  149. @objc dynamic var optObjectCol: SwiftBoolObject? = SwiftBoolObject(value: [true])
  150. override class func ignoredProperties() -> [String] {
  151. return [
  152. "optNSStringCol",
  153. "optStringCol",
  154. "optBinaryCol",
  155. "optDateCol",
  156. "optObjectCol"
  157. ]
  158. }
  159. }
  160. class SwiftDogObject: Object {
  161. @objc dynamic var dogName = ""
  162. let owners = LinkingObjects(fromType: SwiftOwnerObject.self, property: "dog")
  163. }
  164. class SwiftOwnerObject: Object {
  165. @objc dynamic var name = ""
  166. @objc dynamic var dog: SwiftDogObject? = SwiftDogObject()
  167. }
  168. class SwiftAggregateObject: Object {
  169. @objc dynamic var intCol = 0
  170. @objc dynamic var floatCol = 0 as Float
  171. @objc dynamic var doubleCol = 0.0
  172. @objc dynamic var boolCol = false
  173. @objc dynamic var dateCol = Date()
  174. @objc dynamic var trueCol = true
  175. let stringListCol = List<SwiftStringObject>()
  176. }
  177. class SwiftAllIntSizesObject: Object {
  178. @objc dynamic var int8: Int8 = 0
  179. @objc dynamic var int16: Int16 = 0
  180. @objc dynamic var int32: Int32 = 0
  181. @objc dynamic var int64: Int64 = 0
  182. }
  183. class SwiftEmployeeObject: Object {
  184. @objc dynamic var name = ""
  185. @objc dynamic var age = 0
  186. @objc dynamic var hired = false
  187. }
  188. class SwiftCompanyObject: Object {
  189. let employees = List<SwiftEmployeeObject>()
  190. }
  191. class SwiftArrayPropertyObject: Object {
  192. @objc dynamic var name = ""
  193. let array = List<SwiftStringObject>()
  194. let intArray = List<SwiftIntObject>()
  195. }
  196. class SwiftDoubleListOfSwiftObject: Object {
  197. let array = List<SwiftListOfSwiftObject>()
  198. }
  199. class SwiftListOfSwiftObject: Object {
  200. let array = List<SwiftObject>()
  201. }
  202. class SwiftListOfSwiftOptionalObject: Object {
  203. let array = List<SwiftOptionalObject>()
  204. }
  205. class SwiftArrayPropertySubclassObject: SwiftArrayPropertyObject {
  206. let boolArray = List<SwiftBoolObject>()
  207. }
  208. class SwiftLinkToPrimaryStringObject: Object {
  209. @objc dynamic var pk = ""
  210. @objc dynamic var object: SwiftPrimaryStringObject?
  211. let objects = List<SwiftPrimaryStringObject>()
  212. override class func primaryKey() -> String? {
  213. return "pk"
  214. }
  215. }
  216. class SwiftUTF8Object: Object {
  217. // swiftlint:disable:next identifier_name
  218. @objc dynamic var 柱колоéнǢкƱаم👍 = "值значен™👍☞⎠‱௹♣︎☐▼❒∑⨌⧭иеمرحبا"
  219. }
  220. class SwiftIgnoredPropertiesObject: Object {
  221. @objc dynamic var name = ""
  222. @objc dynamic var age = 0
  223. @objc dynamic var runtimeProperty: AnyObject?
  224. @objc dynamic var runtimeDefaultProperty = "property"
  225. @objc dynamic var readOnlyProperty: Int { return 0 }
  226. override class func ignoredProperties() -> [String] {
  227. return ["runtimeProperty", "runtimeDefaultProperty"]
  228. }
  229. }
  230. class SwiftRecursiveObject: Object {
  231. let objects = List<SwiftRecursiveObject>()
  232. }
  233. protocol SwiftPrimaryKeyObjectType {
  234. associatedtype PrimaryKey
  235. static func primaryKey() -> String?
  236. }
  237. class SwiftPrimaryStringObject: Object, SwiftPrimaryKeyObjectType {
  238. @objc dynamic var stringCol = ""
  239. @objc dynamic var intCol = 0
  240. typealias PrimaryKey = String
  241. override class func primaryKey() -> String? {
  242. return "stringCol"
  243. }
  244. }
  245. class SwiftPrimaryOptionalStringObject: Object, SwiftPrimaryKeyObjectType {
  246. @objc dynamic var stringCol: String? = ""
  247. @objc dynamic var intCol = 0
  248. typealias PrimaryKey = String?
  249. override class func primaryKey() -> String? {
  250. return "stringCol"
  251. }
  252. }
  253. class SwiftPrimaryIntObject: Object, SwiftPrimaryKeyObjectType {
  254. @objc dynamic var stringCol = ""
  255. @objc dynamic var intCol = 0
  256. typealias PrimaryKey = Int
  257. override class func primaryKey() -> String? {
  258. return "intCol"
  259. }
  260. }
  261. class SwiftPrimaryOptionalIntObject: Object, SwiftPrimaryKeyObjectType {
  262. @objc dynamic var stringCol = ""
  263. let intCol = RealmOptional<Int>()
  264. typealias PrimaryKey = RealmOptional<Int>
  265. override class func primaryKey() -> String? {
  266. return "intCol"
  267. }
  268. }
  269. class SwiftPrimaryInt8Object: Object, SwiftPrimaryKeyObjectType {
  270. @objc dynamic var stringCol = ""
  271. @objc dynamic var int8Col: Int8 = 0
  272. typealias PrimaryKey = Int8
  273. override class func primaryKey() -> String? {
  274. return "int8Col"
  275. }
  276. }
  277. class SwiftPrimaryOptionalInt8Object: Object, SwiftPrimaryKeyObjectType {
  278. @objc dynamic var stringCol = ""
  279. let int8Col = RealmOptional<Int8>()
  280. typealias PrimaryKey = RealmOptional<Int8>
  281. override class func primaryKey() -> String? {
  282. return "int8Col"
  283. }
  284. }
  285. class SwiftPrimaryInt16Object: Object, SwiftPrimaryKeyObjectType {
  286. @objc dynamic var stringCol = ""
  287. @objc dynamic var int16Col: Int16 = 0
  288. typealias PrimaryKey = Int16
  289. override class func primaryKey() -> String? {
  290. return "int16Col"
  291. }
  292. }
  293. class SwiftPrimaryOptionalInt16Object: Object, SwiftPrimaryKeyObjectType {
  294. @objc dynamic var stringCol = ""
  295. let int16Col = RealmOptional<Int16>()
  296. typealias PrimaryKey = RealmOptional<Int16>
  297. override class func primaryKey() -> String? {
  298. return "int16Col"
  299. }
  300. }
  301. class SwiftPrimaryInt32Object: Object, SwiftPrimaryKeyObjectType {
  302. @objc dynamic var stringCol = ""
  303. @objc dynamic var int32Col: Int32 = 0
  304. typealias PrimaryKey = Int32
  305. override class func primaryKey() -> String? {
  306. return "int32Col"
  307. }
  308. }
  309. class SwiftPrimaryOptionalInt32Object: Object, SwiftPrimaryKeyObjectType {
  310. @objc dynamic var stringCol = ""
  311. let int32Col = RealmOptional<Int32>()
  312. typealias PrimaryKey = RealmOptional<Int32>
  313. override class func primaryKey() -> String? {
  314. return "int32Col"
  315. }
  316. }
  317. class SwiftPrimaryInt64Object: Object, SwiftPrimaryKeyObjectType {
  318. @objc dynamic var stringCol = ""
  319. @objc dynamic var int64Col: Int64 = 0
  320. typealias PrimaryKey = Int64
  321. override class func primaryKey() -> String? {
  322. return "int64Col"
  323. }
  324. }
  325. class SwiftPrimaryOptionalInt64Object: Object, SwiftPrimaryKeyObjectType {
  326. @objc dynamic var stringCol = ""
  327. let int64Col = RealmOptional<Int64>()
  328. typealias PrimaryKey = RealmOptional<Int64>
  329. override class func primaryKey() -> String? {
  330. return "int64Col"
  331. }
  332. }
  333. class SwiftIndexedPropertiesObject: Object {
  334. @objc dynamic var stringCol = ""
  335. @objc dynamic var intCol = 0
  336. @objc dynamic var int8Col: Int8 = 0
  337. @objc dynamic var int16Col: Int16 = 0
  338. @objc dynamic var int32Col: Int32 = 0
  339. @objc dynamic var int64Col: Int64 = 0
  340. @objc dynamic var boolCol = false
  341. @objc dynamic var dateCol = Date()
  342. @objc dynamic var floatCol: Float = 0.0
  343. @objc dynamic var doubleCol: Double = 0.0
  344. @objc dynamic var dataCol = Data()
  345. override class func indexedProperties() -> [String] {
  346. return ["stringCol", "intCol", "int8Col", "int16Col", "int32Col", "int64Col", "boolCol", "dateCol"]
  347. }
  348. }
  349. class SwiftIndexedOptionalPropertiesObject: Object {
  350. @objc dynamic var optionalStringCol: String? = ""
  351. let optionalIntCol = RealmOptional<Int>()
  352. let optionalInt8Col = RealmOptional<Int8>()
  353. let optionalInt16Col = RealmOptional<Int16>()
  354. let optionalInt32Col = RealmOptional<Int32>()
  355. let optionalInt64Col = RealmOptional<Int64>()
  356. let optionalBoolCol = RealmOptional<Bool>()
  357. @objc dynamic var optionalDateCol: Date? = Date()
  358. let optionalFloatCol = RealmOptional<Float>()
  359. let optionalDoubleCol = RealmOptional<Double>()
  360. @objc dynamic var optionalDataCol: Data? = Data()
  361. override class func indexedProperties() -> [String] {
  362. return ["optionalStringCol", "optionalIntCol", "optionalInt8Col", "optionalInt16Col",
  363. "optionalInt32Col", "optionalInt64Col", "optionalBoolCol", "optionalDateCol"]
  364. }
  365. }
  366. class SwiftCustomInitializerObject: Object {
  367. @objc dynamic var stringCol: String
  368. init(stringVal: String) {
  369. stringCol = stringVal
  370. super.init()
  371. }
  372. required init() {
  373. stringCol = ""
  374. super.init()
  375. }
  376. }
  377. class SwiftConvenienceInitializerObject: Object {
  378. @objc dynamic var stringCol = ""
  379. convenience init(stringCol: String) {
  380. self.init()
  381. self.stringCol = stringCol
  382. }
  383. }
  384. class SwiftObjectiveCTypesObject: Object {
  385. @objc dynamic var stringCol: NSString?
  386. @objc dynamic var dateCol: NSDate?
  387. @objc dynamic var dataCol: NSData?
  388. }
  389. class SwiftComputedPropertyNotIgnoredObject: Object {
  390. // swiftlint:disable:next identifier_name
  391. @objc dynamic var _urlBacking = ""
  392. // Dynamic; no ivar
  393. @objc dynamic var dynamicURL: URL? {
  394. get {
  395. return URL(string: _urlBacking)
  396. }
  397. set {
  398. _urlBacking = newValue?.absoluteString ?? ""
  399. }
  400. }
  401. // Non-dynamic; no ivar
  402. var url: URL? {
  403. get {
  404. return URL(string: _urlBacking)
  405. }
  406. set {
  407. _urlBacking = newValue?.absoluteString ?? ""
  408. }
  409. }
  410. }
  411. @objc(SwiftObjcRenamedObject)
  412. class SwiftObjcRenamedObject: Object {
  413. @objc dynamic var stringCol = ""
  414. }
  415. @objc(SwiftObjcRenamedObjectWithTotallyDifferentName)
  416. class SwiftObjcArbitrarilyRenamedObject: Object {
  417. @objc dynamic var boolCol = false
  418. }
  419. class SwiftCircleObject: Object {
  420. @objc dynamic var obj: SwiftCircleObject?
  421. let array = List<SwiftCircleObject>()
  422. }
  423. // Exists to serve as a superclass to `SwiftGenericPropsOrderingObject`
  424. class SwiftGenericPropsOrderingParent: Object {
  425. var implicitlyIgnoredComputedProperty: Int { return 0 }
  426. let implicitlyIgnoredReadOnlyProperty: Int = 1
  427. let parentFirstList = List<SwiftIntObject>()
  428. @objc dynamic var parentFirstNumber = 0
  429. func parentFunction() -> Int { return parentFirstNumber + 1 }
  430. @objc dynamic var parentSecondNumber = 1
  431. var parentComputedProp: String { return "hello world" }
  432. }
  433. // Used to verify that Swift properties (generic and otherwise) are detected properly and
  434. // added to the schema in the correct order.
  435. class SwiftGenericPropsOrderingObject: SwiftGenericPropsOrderingParent {
  436. func myFunction() -> Int { return firstNumber + secondNumber + thirdNumber }
  437. @objc dynamic var dynamicComputed: Int { return 999 }
  438. var firstIgnored = 999
  439. @objc dynamic var dynamicIgnored = 999
  440. @objc dynamic var firstNumber = 0 // Managed property
  441. class func myClassFunction(x: Int, y: Int) -> Int { return x + y }
  442. var secondIgnored = 999
  443. lazy var lazyIgnored = 999
  444. let firstArray = List<SwiftStringObject>() // Managed property
  445. @objc dynamic var secondNumber = 0 // Managed property
  446. var computedProp: String { return "\(firstNumber), \(secondNumber), and \(thirdNumber)" }
  447. let secondArray = List<SwiftStringObject>() // Managed property
  448. override class func ignoredProperties() -> [String] {
  449. return ["firstIgnored", "dynamicIgnored", "secondIgnored", "thirdIgnored", "lazyIgnored", "dynamicLazyIgnored"]
  450. }
  451. let firstOptionalNumber = RealmOptional<Int>() // Managed property
  452. var thirdIgnored = 999
  453. @objc dynamic lazy var dynamicLazyIgnored = 999
  454. let firstLinking = LinkingObjects(fromType: SwiftGenericPropsOrderingHelper.self, property: "first")
  455. let secondLinking = LinkingObjects(fromType: SwiftGenericPropsOrderingHelper.self, property: "second")
  456. @objc dynamic var thirdNumber = 0 // Managed property
  457. let secondOptionalNumber = RealmOptional<Int>() // Managed property
  458. }
  459. // Only exists to allow linking object properties on `SwiftGenericPropsNotLastObject`.
  460. class SwiftGenericPropsOrderingHelper: Object {
  461. @objc dynamic var first: SwiftGenericPropsOrderingObject?
  462. @objc dynamic var second: SwiftGenericPropsOrderingObject?
  463. }
  464. class SwiftRenamedProperties1: Object {
  465. @objc dynamic var propA = 0
  466. @objc dynamic var propB = ""
  467. let linking1 = LinkingObjects(fromType: LinkToSwiftRenamedProperties1.self, property: "linkA")
  468. let linking2 = LinkingObjects(fromType: LinkToSwiftRenamedProperties2.self, property: "linkD")
  469. override class func _realmObjectName() -> String { return "Swift Renamed Properties" }
  470. override class func _realmColumnNames() -> [String: String] {
  471. return ["propA": "prop 1", "propB": "prop 2"]
  472. }
  473. }
  474. class SwiftRenamedProperties2: Object {
  475. @objc dynamic var propC = 0
  476. @objc dynamic var propD = ""
  477. let linking1 = LinkingObjects(fromType: LinkToSwiftRenamedProperties1.self, property: "linkA")
  478. let linking2 = LinkingObjects(fromType: LinkToSwiftRenamedProperties2.self, property: "linkD")
  479. override class func _realmObjectName() -> String { return "Swift Renamed Properties" }
  480. override class func _realmColumnNames() -> [String: String] {
  481. return ["propC": "prop 1", "propD": "prop 2"]
  482. }
  483. }
  484. class LinkToSwiftRenamedProperties1: Object {
  485. @objc dynamic var linkA: SwiftRenamedProperties1?
  486. @objc dynamic var linkB: SwiftRenamedProperties2?
  487. let array1 = List<SwiftRenamedProperties1>()
  488. override class func _realmObjectName() -> String { return "Link To Swift Renamed Properties" }
  489. override class func _realmColumnNames() -> [String: String] {
  490. return ["linkA": "link 1", "linkB": "link 2", "array1": "array"]
  491. }
  492. }
  493. class LinkToSwiftRenamedProperties2: Object {
  494. @objc dynamic var linkC: SwiftRenamedProperties1?
  495. @objc dynamic var linkD: SwiftRenamedProperties2?
  496. let array2 = List<SwiftRenamedProperties2>()
  497. override class func _realmObjectName() -> String { return "Link To Swift Renamed Properties" }
  498. override class func _realmColumnNames() -> [String: String] {
  499. return ["linkC": "link 1", "linkD": "link 2", "array2": "array"]
  500. }
  501. }