Le 12 févr. 2017 à 18:41, Karl Wagner <razie...@gmail.com> a écrit :
> 
> I've seen this before; I considered it something to be resolved in AppKit. 
> Strings in Swift are values, and the framework expects it to be a reference. 
> Since NSTextStorage is itself a reference-type and informs its delegate of 
> changes, those frameworks should probably retain the NSTS itself and pull 
> Strings out as-needed.

Well, this is apparently not an AppKit problem because the `string` method is 
first defined in `NSAttributedString` in Foundation. `NSTextStorage` only 
inherits that method.

The cleanest fix I can see at the framework level is expose it as two 
properties in `NSAttributedString`:

        // swift-only getter for the string, can't override this one
        @nonobjc
        final public var string: String { 
                get { return backingString as String }
        }

        // this is the one mapped to `string` in objc, you can override this one
        @objc(string)
        public var backingString: NSString { get } 

This is somewhat analogous to what I'm doing with `method_setImplementation` in 
my solution to remap the method to a Swift method that has the right signature.

That would be source-breaking, but only for those who override the property. 
Pretty much all of these overrides are going to be violating the API contract 
anyway. They probably deserve the error so they can be fixed.

At this point though, I think the topic belong to somewhere else than 
swift-users. I'm just not sure where. I should probably file a radar against 
Foundation at the very least.

-- 
Michel Fortin
https://michelf.ca

_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to