<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">"We need to get ahold of a class given a name" is definitely a requirement to do NSCoding right. I'm not at all convinced dlsym is a valid long-term answer for that, though. If you have an 'internal' class, it doesn't (currently) have a public symbol that you can use dlsym for.</div><div class=""><br class=""></div><div class="">This sort of goes with the existing problem of static registration: there's no pure Swift way to get all subclasses of a class, or to get a class from a name for any other reason. That's a general language problem, though, and we should discuss it on swift-dev.</div><div class=""><br class=""></div><div class="">Jordan</div><div class=""><br class=""></div><br class=""><div><blockquote type="cite" class=""><div class="">On Dec 23, 2015, at 15:12, Philippe Hausler &lt;<a href="mailto:phausler@apple.com" class="">phausler@apple.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">NSCoding will have to use something to transform from strings to classes, and that satisfy the two cases (or more) that we have already shown, currently there is no thing that does that in either form; either mangled or non mangled. Basically we need something to implement NSClassFromString with. Which we have clearly shown that dlsym does not fully meet the needs since there are cases that will emit as “module.classname” and others that emit as the mangled name. The simple case is probably going to be the a very common usage pattern for consumers (and of previously built applications). The inner class should definitely be handled in addition to this case.</div><div class=""><br class=""></div><div class="">Are there any methods that can fetch the name (either the symbolic or the readable) given a AnyClass in the runtime to get work started here? I think it is definitely sensible as a start to restrict this just to descendants of the class NSObject. I would presume that since the Metadata is potentially volatile contents we should use something along the lines of&nbsp;swift_getTypeName etc?</div><br class=""><div class=""><blockquote type="cite" class=""><div class="">On Dec 23, 2015, at 2:53 PM, Jordan Rose &lt;<a href="mailto:jordan_rose@apple.com" class="">jordan_rose@apple.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">Here's another example on OS X:</div><div class=""><br class=""></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div class=""><div class="">import Foundation</div></div><div class=""><div class=""><br class=""></div></div><div class=""><div class="">class Outer {</div></div><div class=""><div class="">&nbsp; &nbsp; class Inner : NSObject, NSCoding {</div></div><div class=""><div class="">&nbsp; &nbsp; &nbsp; &nbsp; let uuid: Foundation.NSUUID</div></div><div class=""><div class="">&nbsp; &nbsp; &nbsp; &nbsp; required init?(coder aDecoder: NSCoder) {</div></div><div class=""><div class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; uuid = aDecoder.decodeObjectForKey("my.uuid") as! Foundation.NSUUID</div></div><div class=""><div class="">&nbsp; &nbsp; &nbsp; &nbsp; }</div></div><div class=""><div class="">&nbsp; &nbsp; &nbsp; &nbsp; override init() {</div></div><div class=""><div class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; uuid = Foundation.NSUUID()</div></div><div class=""><div class="">&nbsp; &nbsp; &nbsp; &nbsp; }</div></div><div class=""><div class="">&nbsp; &nbsp; &nbsp; &nbsp; func encodeWithCoder(aCoder: NSCoder) {</div></div><div class=""><div class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; aCoder.encodeObject(uuid, forKey: "my.uuid")</div></div><div class=""><div class="">&nbsp; &nbsp; &nbsp; &nbsp; }</div></div><div class=""><div class="">&nbsp; &nbsp; }</div></div><div class=""><div class="">}</div></div><div class=""><div class=""><br class=""></div></div><div class=""><div class="">NSKeyedArchiver.archiveRootObject(Outer.Inner(), toFile: "/Users/jrose/Desktop/test-archive")</div></div></blockquote><div class=""><br class=""></div><div class=""><br class=""></div><div class="">Which results in this archive:</div><div class=""><br class=""></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(76, 47, 45); background-color: rgb(223, 219, 196);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">{</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(76, 47, 45); background-color: rgb(223, 219, 196);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; "$version" =&gt; 100000</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(76, 47, 45); background-color: rgb(223, 219, 196);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; "$objects" =&gt; [</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(76, 47, 45); background-color: rgb(223, 219, 196);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; 0 =&gt; "$null"</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(76, 47, 45); background-color: rgb(223, 219, 196);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; 1 =&gt; {</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(76, 47, 45); background-color: rgb(223, 219, 196);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; &nbsp; "my.uuid" =&gt; &lt;CFKeyedArchiverUID 0x7f8992c0e9d0 [0x7fff7c5acd80]&gt;{value = 2}</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(76, 47, 45); background-color: rgb(223, 219, 196);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; &nbsp; "$class" =&gt; &lt;CFKeyedArchiverUID 0x7f8992c0ec90 [0x7fff7c5acd80]&gt;{value = 4}</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(76, 47, 45); background-color: rgb(223, 219, 196);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; }</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(76, 47, 45); background-color: rgb(223, 219, 196);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; 2 =&gt; {</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(76, 47, 45); background-color: rgb(223, 219, 196);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; &nbsp; "NS.uuidbytes" =&gt; &lt;67f0b08b c8274f8c b0c78d90 bd4627dc&gt;</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(76, 47, 45); background-color: rgb(223, 219, 196);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; &nbsp; "$class" =&gt; &lt;CFKeyedArchiverUID 0x7f8992c0eda0 [0x7fff7c5acd80]&gt;{value = 3}</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(76, 47, 45); background-color: rgb(223, 219, 196);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; }</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(76, 47, 45); background-color: rgb(223, 219, 196);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; 3 =&gt; {</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(76, 47, 45); background-color: rgb(223, 219, 196);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; &nbsp; "$classname" =&gt; "NSUUID"</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(76, 47, 45); background-color: rgb(223, 219, 196);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; &nbsp; "$classes" =&gt; [</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(76, 47, 45); background-color: rgb(223, 219, 196);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; &nbsp; &nbsp; 0 =&gt; "NSUUID"</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(76, 47, 45); background-color: rgb(223, 219, 196);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; &nbsp; &nbsp; 1 =&gt; "NSObject"</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(76, 47, 45); background-color: rgb(223, 219, 196);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; &nbsp; ]</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(76, 47, 45); background-color: rgb(223, 219, 196);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; }</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(76, 47, 45); background-color: rgb(223, 219, 196);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; 4 =&gt; {</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(76, 47, 45); background-color: rgb(223, 219, 196);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; &nbsp; "$classname" =&gt; "_TtCC4main5Outer5Inner"</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(76, 47, 45); background-color: rgb(223, 219, 196);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; &nbsp; "$classes" =&gt; [</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(76, 47, 45); background-color: rgb(223, 219, 196);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; &nbsp; &nbsp; 0 =&gt; "_TtCC4main5Outer5Inner"</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(76, 47, 45); background-color: rgb(223, 219, 196);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; &nbsp; &nbsp; 1 =&gt; "NSObject"</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(76, 47, 45); background-color: rgb(223, 219, 196);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; &nbsp; ]</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(76, 47, 45); background-color: rgb(223, 219, 196);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; }</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(76, 47, 45); background-color: rgb(223, 219, 196);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; ]</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(76, 47, 45); background-color: rgb(223, 219, 196);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; "$archiver" =&gt; "NSKeyedArchiver"</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(76, 47, 45); background-color: rgb(223, 219, 196);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; "$top" =&gt; {</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(76, 47, 45); background-color: rgb(223, 219, 196);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; "root" =&gt; &lt;CFKeyedArchiverUID 0x7f8992c0f0c0 [0x7fff7c5acd80]&gt;{value = 1}</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(76, 47, 45); background-color: rgb(223, 219, 196);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; }</span></div></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(76, 47, 45); background-color: rgb(223, 219, 196);" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">}</span></div></div></blockquote><div class=""><span style="font-variant-ligatures: no-common-ligatures" class=""><br class=""></span></div><div class="">NSStringFromClass makes pretty names when they fall into the "simple" category, but that's not an arbitrarily extensible transformation, and NSCoding shouldn't have to know anything about it.</div><div class=""><span style="font-variant-ligatures: no-common-ligatures" class=""><br class=""></span></div><div class=""><span style="font-variant-ligatures: no-common-ligatures" class="">Jordan</span></div><br class=""><div class=""><blockquote type="cite" class=""><div class="">On Dec 23, 2015, at 14:48, Philippe Hausler &lt;<a href="mailto:phausler@apple.com" class="">phausler@apple.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">The archiving format encodes the names of the classes in the archive itself. Here are a few code examples and a quasi readable output from them:</div><div class=""><br class=""></div><div class="">let&nbsp;uuid =&nbsp;NSUUID()<br class="">let&nbsp;data =&nbsp;NSKeyedArchiver.archivedDataWithRootObject(uuid)<br class="">let&nbsp;archive =&nbsp;try!&nbsp;NSPropertyListSerialization.propertyListWithData(data, options: [], format:&nbsp;nil)<br class="">print(archive)<br class=""><br class=""></div><div class="">prints the following:</div><div class=""><br class=""></div><div class="">{<br class="">&nbsp; &nbsp;&nbsp;"$archiver" = NSKeyedArchiver;<br class="">&nbsp; &nbsp;&nbsp;"$objects" =&nbsp;&nbsp; &nbsp;&nbsp;(<br class="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"$null",<br class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;{<br class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"$class" = "&lt;CFKeyedArchiverUID 0x1030025e0 [0x7fff7ab33bb0]&gt;{value = 2}";<br class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"NS.uuidbytes" = &lt;797639fe dad74b14 902afab3 c490448b&gt;;<br class="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;},<br class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;{<br class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"$classes" =&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;(<br class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;NSUUID,<br class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;NSObject<br class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;);<br class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"$classname" = NSUUID;<br class="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;}<br class="">&nbsp; &nbsp;&nbsp;);<br class="">&nbsp; &nbsp;&nbsp;"$top" =&nbsp;&nbsp; &nbsp;&nbsp;{<br class="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;root = "&lt;CFKeyedArchiverUID 0x103002a80 [0x7fff7ab33bb0]&gt;{value = 1}";<br class="">&nbsp; &nbsp;&nbsp;};<br class="">&nbsp; &nbsp;&nbsp;"$version" = 100000;<br class="">}</div><div class=""><br class=""></div><div class="">Note the $classes and $classname objects; which are what tell the internal implementation of NSKeyedUnarchiver what to construct; moreover you can create your own classes..</div><div class=""><br class=""></div><div class="">// I don’t really think this is a good naming for an application’s class but hey it might happen...</div><div class="">class&nbsp;NSUUID :&nbsp;NSObject,&nbsp;NSCoding&nbsp;{<br class="">&nbsp; &nbsp;&nbsp;let&nbsp;uuid:&nbsp;Foundation.NSUUID<br class="">&nbsp; &nbsp;&nbsp;required&nbsp;init?(coder aDecoder:&nbsp;NSCoder) {<br class="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;uuid&nbsp;= aDecoder.decodeObjectForKey("my.uuid")&nbsp;as!&nbsp;Foundation.NSUUID<br class="">&nbsp; &nbsp;&nbsp;}<br class="">&nbsp; &nbsp;&nbsp;override&nbsp;init() {<br class="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;uuid&nbsp;= Foundation.NSUUID()<br class="">&nbsp; &nbsp;&nbsp;}<br class="">&nbsp; &nbsp;&nbsp;func&nbsp;encodeWithCoder(aCoder:&nbsp;NSCoder) {<br class="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;aCoder.encodeObject(uuid, forKey:&nbsp;"my.uuid")<br class="">&nbsp; &nbsp;&nbsp;}<br class="">}<br class=""><br class="">let&nbsp;uuid =&nbsp;NSUUID()<br class="">let&nbsp;data =&nbsp;NSKeyedArchiver.archivedDataWithRootObject(uuid)<br class="">let&nbsp;archive =&nbsp;try!&nbsp;NSPropertyListSerialization.propertyListWithData(data, options: [], format:&nbsp;nil)<br class="">print(archive)</div><div class=""><br class=""></div><div class="">prints the following:</div><div class=""><br class=""></div><div class="">{<br class="">&nbsp; &nbsp;&nbsp;"$archiver" = NSKeyedArchiver;<br class="">&nbsp; &nbsp;&nbsp;"$objects" =&nbsp;&nbsp; &nbsp;&nbsp;(<br class="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"$null",<br class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;{<br class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"$class" = "&lt;CFKeyedArchiverUID 0x100709630 [0x7fff7ab33bb0]&gt;{value = 4}";<br class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"my.uuid" = "&lt;CFKeyedArchiverUID 0x100708e60 [0x7fff7ab33bb0]&gt;{value = 2}";<br class="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;},<br class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;{<br class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"$class" = "&lt;CFKeyedArchiverUID 0x100709740 [0x7fff7ab33bb0]&gt;{value = 3}";<br class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"NS.uuidbytes" = &lt;546e5b5e 15c244a1 aa96eb90 30c3f7f6&gt;;<br class="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;},<br class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;{<br class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"$classes" =&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;(<br class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;NSUUID,<br class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;NSObject<br class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;);<br class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"$classname" = NSUUID;<br class="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;},<br class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;{<br class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"$classes" =&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;(<br class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"Archiver.NSUUID",<br class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;NSObject<br class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;);<br class="">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"$classname" = "Archiver.NSUUID";<br class="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;}<br class="">&nbsp; &nbsp;&nbsp;);<br class="">&nbsp; &nbsp;&nbsp;"$top" =&nbsp;&nbsp; &nbsp;&nbsp;{<br class="">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;root = "&lt;CFKeyedArchiverUID 0x100709b70 [0x7fff7ab33bb0]&gt;{value = 1}";<br class="">&nbsp; &nbsp;&nbsp;};<br class="">&nbsp; &nbsp;&nbsp;"$version" = 100000;<br class="">}</div><div class=""><br class=""></div><div class="">Granted this is a questionable name for a class but it illustrates which class names are encoded where and how they should be interpreted in the pre-existing archive format; which we will have to figure out some sensible way of inflating and deflating to/from disk/network etc.</div><br class=""><div class=""><blockquote type="cite" class=""><div class="">On Dec 23, 2015, at 2:37 PM, Jordan Rose &lt;<a href="mailto:jordan_rose@apple.com" class="">jordan_rose@apple.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">No, we cannot encode things "non-mangled but with the namespace". For any type other than top-level non-generic class types, using a non-mangled name is not unique. The only correct answer for arbitrary classes is to use mangled names, or something that maps one-to-one with mangled names.</div><div class=""><br class=""></div><div class="">Now, Foundation classes are <i class="">not</i>&nbsp;arbitrary classes, but then I don't see why we'd need to use mangled names for those. We can just use the plain old Objective-C names that the OS X classes use today.</div><div class=""><br class=""></div><div class="">Jordan</div><br class=""><div class=""><blockquote type="cite" class=""><div class="">On Dec 22, 2015, at 10:16, Philippe Hausler via swift-corelibs-dev &lt;<a href="mailto:swift-corelibs-dev@swift.org" class="">swift-corelibs-dev@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">To clarify the goals: I think it is reasonable for us to have a goal to be able to encode/decode archives from foreign targets; e.g. linux encodes an archive and mac os x decodes or iOS encodes and linux decodes. This will allow for server architecture to transmit binary archives across the wire. This will mean that we will want to have the encoded class names from the application scope to be encoded as the non mangled name but with the namespace. However this presents a problem; Foundation will have a namespace which will need to be inferred both for encoding and decoding. Thankfully there may be a reasonable way to approach this;</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">public class func classNameForClass(cls: AnyClass) -&gt; String?</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">public class func setClassName(codedName: String?, forClass cls: AnyClass)</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">These methods can be used to allow for translation of classes by registering the appropriate classes for a “shortened” name that drops the Foundation/SwiftFoundation namespace prefix during encoding.</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">On Dec 22, 2015, at 2:45 AM, Luke Howard via swift-corelibs-dev &lt;<a href="mailto:swift-corelibs-dev@swift.org" class="">swift-corelibs-dev@swift.org</a>&gt; wrote:<br class=""><br class=""><br class=""><blockquote type="cite" class="">On 22 Dec 2015, at 5:50 AM, Jordan Rose &lt;<a href="mailto:jordan_rose@apple.com" class="">jordan_rose@apple.com</a>&gt; wrote:<br class=""><br class="">IMHO on Linux NSKeyedArchiver should always use mangled names. If we want cross-platform archives, we should set up standard substitutions, but given that Swift classes exposed to Objective-C are archived with their full names it doesn't make sense to use "half the name" in the archive.<br class=""></blockquote><br class="">You mean namespaced but unmangled yes? If so I agree.<br class=""><br class="">BTW I found a couple of small CF nits:<br class=""><br class="">* in CFDictionaryGetKeysAndValues(), keybuf and valuebuf are transposed in the call to CF_SWIFT_FUNCDISPATCHV(NSDictionary.getObjects())<br class=""><br class="">* _CFSwiftDictionaryGetKeysAndValues() does not handle keybuf or valbuf being NULL (either of which are valid when calling CFDictionaryGetKeysAndValues())<br class=""><br class=""></blockquote><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">This is a bit un-related to NSCoding and the transposition is probably a mistake if it is inverted (the CF method should be reversed from the NS method to mimic the objc counterpart)</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">— Luke<br class="">_______________________________________________<br class="">swift-corelibs-dev mailing list<br class=""><a href="mailto:swift-corelibs-dev@swift.org" class="">swift-corelibs-dev@swift.org</a><br class=""><a href="https://lists.swift.org/mailman/listinfo/swift-corelibs-dev" class="">https://lists.swift.org/mailman/listinfo/swift-corelibs-dev</a><br class=""></blockquote><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">_______________________________________________</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">swift-corelibs-dev mailing list</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><a href="mailto:swift-corelibs-dev@swift.org" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">swift-corelibs-dev@swift.org</a><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><a href="https://lists.swift.org/mailman/listinfo/swift-corelibs-dev" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">https://lists.swift.org/mailman/listinfo/swift-corelibs-dev</a></div></blockquote></div><br class=""></div></div></blockquote></div><br class=""></div></div></blockquote></div><br class=""></div></div></blockquote></div><br class=""></div></div></blockquote></div><br class=""></body></html>