Thanks a lot Jordan,

ObjectIdentifier seems pretty cool, looks like a way of representing everything 
identifiable in Swift (AnyObject and Any.Type).

Easier to use and debug, would be perfect for what I am looking for !

The ObjectIdentifier documentation pretty much sums it up: 
"In Swift, only class instances and metatypes have unique identities. There is 
no notion of identity for structs, enums, functions, or tuples."


class C {}
struct S {}

let c1 = C()
let c2 = c1

print("c1 address: \(Unmanaged.passUnretained(c1).toOpaque())")

let o1 = ObjectIdentifier(c1)
let o2 = ObjectIdentifier(c2)

print("o1 -> c1 = \(o1)")
print("o2 -> c2 = \(o2)")

if o1 == o2 {
    print("c1 = c2")
} else {
    print("c1 != c2")
}

let o3 = ObjectIdentifier(C.self)
let o4 = ObjectIdentifier(S.self)

print("o3 -> C = \(o3)")
print("o4 -> S = \(o4)")

//Output:
//c1 address: 0x00006040000165e0
//o1 -> c1 = ObjectIdentifier(0x00006040000165e0)
//o2 -> c2 = ObjectIdentifier(0x00006040000165e0)
//c1 = c2
//o3 -> C = ObjectIdentifier(0x00000001210b87f0)
//o4 -> S = ObjectIdentifier(0x00000001210b86c8)


Thanks and regards,
Muthu



> On 13 Sep 2017, at 5:12 AM, Jordan Rose <jordan_r...@apple.com> wrote:
> 
> 
> 
>> On Sep 12, 2017, at 10:20, Andrew Trick via swift-users 
>> <swift-users@swift.org <mailto:swift-users@swift.org>> wrote:
>> 
>>> 
>>> On Sep 12, 2017, at 9:55 AM, somu subscribe via swift-users 
>>> <swift-users@swift.org <mailto:swift-users@swift.org>> wrote:
>>> 
>>> Hi Quinn,
>>> 
>>> Thanks for the reply,
>>> 
>>> It is an iOS Swift project (uses Foundation, UIKit, CloudKit and other 
>>> native frameworks) in which I would like to check the memory address for 
>>> debugging (and out of enthusiasm). There is no C code I am using.
>>> 
>>> I have some asynchronous call back functions from CloudKit frameworks which 
>>> return CKUserIdentity objects.
>>> 
>>> So thought it would be nice if I could print the memory address of 
>>> CKUserIdentity objects and to check if it was unique.
>>> 
>>> And there are some other custom Swift Structs which I would like to know 
>>> the memory address of.
>>> 
>>> Thanks and regards,
>>> Muthu
>> 
>> For classes, use the Unmanaged API as Quinn’s suggested.
> 
> If you really just want a unique value and don't want to do anything with 
> that value, ObjectIdentifier is even easier to use.
> 
> Jordan
> 
> 
>> 
>> Your structs, tuples, and enums only have an address during mutation. So, 
>> for example, if you wrap all of your code in a function that takes the 
>> variable `inout`, you’ll see a consistent address within a single call to 
>> that function. There’s an implicit cast from `inout` to 
>> Unsafe[Mutable]Pointer arguments, so you can inspect the pointer value...
>> 
>> func foo(p: Unsafe[Mutable]Pointer) { print(p) }
>> 
>> foo(&s2)
>> 
>> As you noticed, between calls to `foo` you could see a different address.
>> 
>> If you really want to give your structs an “identity” you would need to wrap 
>> them in a class.
>> 
>> -Andy
>> 
>>>> On 12 Sep 2017, at 10:35 PM, Quinn The Eskimo! via swift-users 
>>>> <swift-users@swift.org <mailto:swift-users@swift.org>> wrote:
>>>> 
>>>> 
>>>> On 12 Sep 2017, at 13:44, somu subscribe via swift-users 
>>>> <swift-users@swift.org <mailto:swift-users@swift.org>> wrote:
>>>> 
>>>>> 1. Is the above shown the correct way to get reference type memory 
>>>>> address ?
>>>>> 2. What Is it the correct way to get value type memory address ?
>>>> 
>>>> It’s hard to answer that without knowing how you’re intended to use these 
>>>> techniques.  If you can explain more about where you’re going with this, I 
>>>> should be able to make some specific recommendations.
>>>> 
>>>> For example, if you’re goal were to pass a Swift object to a C API that 
>>>> takes a callback function pointer and a ‘cookie’ value, and hen calls that 
>>>> function with that cookie (like the `qsort_r` function), the to/from 
>>>> opaque mechanism provider by `Unmanaged` is the recommended way to pass a 
>>>> Swift object through such a cookie value.
>>>> 
>>>>> 3. Is it possible to get the memory address of immutable value type 
>>>>> (declared as let)
>>>> 
>>>> No, because such values don’t necessarily exist in memory.
>>>> 
>>>> Share and Enjoy
>>>> --
>>>> Quinn "The Eskimo!"                    <http://www.apple.com/developer/ 
>>>> <http://www.apple.com/developer/>>
>>>> Apple Developer Relations, Developer Technical Support, Core OS/Hardware
>>>> 
>>>> 
>>>> _______________________________________________
>>>> swift-users mailing list
>>>> swift-users@swift.org <mailto:swift-users@swift.org>
>>>> https://lists.swift.org/mailman/listinfo/swift-users
>>> 
>>> _______________________________________________
>>> swift-users mailing list
>>> swift-users@swift.org <mailto:swift-users@swift.org>
>>> https://lists.swift.org/mailman/listinfo/swift-users
>> 
>> _______________________________________________
>> swift-users mailing list
>> swift-users@swift.org <mailto:swift-users@swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-users 
>> <https://lists.swift.org/mailman/listinfo/swift-users>
_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to