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.    
  
  
  

  
Once the new String model is done (long time yet), I would love it if Apple's 
CoreText team created a truly Swift (i.e. Protocol-based) NSTextStorage API. 
You wouldn't necessarily have to provide a stdlib String; any UTF16-encoded 
Unicode/StringProtocol instance could possibly suffice, allowing you to 
optimise storage through buffer-gaps and whatnot (doable today with 
NSMutableString subclass, but you can't subclass a struct).
  

  
- Karl
  
  
  

  
  
>   
> On Feb 10, 2017 at 10:51 pm,  <Jacob Bandes-Storch via swift-users 
> (mailto:swift-users@swift.org)>  wrote:
>   
>   
>   
> Got some clarity on this from Apple folks on Twitter:   
> https://twitter.com/jtbandes/status/830159670559993856   
>
>   
> On Fri, Feb 10, 2017 at 12:54 PM, Michel Fortin  <michel.for...@michelf.ca 
> (mailto:michel.for...@michelf.ca)>  wrote:
>   
> >   
> > I did file one (30314719). I might not have explained the problem clearly 
> > enough, I suppose, because at the time I was misinterpreting the API 
> > contract thinking it was the new AppKit Touch Bar stuff that was violating 
> > it instead. That bug now sits closed and I hesitate opening a new bug for 
> > the same problem just to ask it to be fixed in another way.   Meanwhile I 
> > found an acceptable workaround that I attached to the existing bug report 
> > in addition and I posted all this to the list. Hopefully someone at the 
> > right place will notice.  
> >
> >   
> > But yeah... maybe I should file another bug, against Foundation's Swift 
> > interface this time, since NSTextStorage's string property comes from 
> > NSAttributedString. I'll think about it.  
> >   
> >
> >   
> >
> >   
> >   
> > >   
> > > Le 10 févr. 2017 à 11:36, Jacob Bandes-Storch  <jtban...@gmail.com 
> > > (mailto:jtban...@gmail.com)>  a écrit :
> > >   
> > >   
> > >   
> > > This seems like a bug (missing feature?) in how the API is imported for 
> > > Swift. You might consider filing a Radar.
> > >   
> > >   
> > >   
> > >   
> > > On Thu, Feb 9, 2017 at 3:12 PM Michel Fortin via swift-users  
> > > <swift-users@swift.org (mailto:swift-users@swift.org)>  wrote:
> > >   
> > > > The `string` property of `NSTextStorage` is of type `String`, but the 
> > > > contract it must implement is that it should return the backing store 
> > > > of the attributed string (the underlying `NSMutableString` used as the 
> > > > backing store). It seems to me that this makes it impossible to 
> > > > implement correctly a subclass of `NSTextStorage` in Swift, because 
> > > > Swift automatically wraps the `NSString` into a `String` and the 
> > > > underlying mutable storage is not passed around.
> > > >   
> > > >  Here's the documentation for that method:
> > > >   
> > > > https://developer.apple.com/reference/foundation/nsattributedstring/1412616-string
> > > >   
> > > >  In case the contract isn't clear from the documentation (it wasn't for 
> > > > me), I got a confirmation as a response in radar 30314719:
> > > >   >  It’s returning a copy of the backing store, but the contract is 
> > > > actually returning the backing store string. The copy storage 
> > > > declaration in the property spec is only used for setter implementation.
> > > >   
> > > >  So looks like this is impossible to model correctly in Swift due to 
> > > > the automatic bridging to `String`. Some APIs in AppKit expect the 
> > > > `NSString` they receive to mutate when mutating the text storage (touch 
> > > > bar suggestions in `NSTextView`) and will do bad things this isn't the 
> > > > case.
> > > >   
> > > >  Obviously, I can work around this by writing some Objective-C code, 
> > > > but it'd be better if I could avoid splitting the class implementation 
> > > > between two languages. There's another way using swizzling to map the 
> > > > Objective-C method to a Swift implementation of the same method that 
> > > > has the correct signature, and that's probably what I'll end up doing 
> > > > unless a better solution can be pointed out to me.
> > > >   
> > > >   
> > > >  --
> > > >  Michel Fortin
> > > >   https://michelf.ca (https://michelf.ca/)
> > > >   
> > > >  _______________________________________________
> > > >  swift-users mailing list
> > > >   swift-users@swift.org (mailto:swift-users@swift.org)
> > > >   https://lists.swift.org/mailman/listinfo/swift-users
> > > >               
> >   
> >   
> >   
> >   
> >   
> >       
> >       
> >       
> >  --   
> >  Michel Fortin   
> >   https://michelf.ca
> >   
> >   
> >   
> >   
> >   
> >   
> >   
> >   
> >               
>    _______________________________________________ swift-users mailing        
_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to