Nice find! The following is a guess as to why this is, I could be wrong:
NSString.contains(_:) in Swift is really the Objective-C method -[NSString containsString:]. The documentation for this method says:
Calling this method is equivalent to calling
rangeOfString:options:with no options.
The documentation for rangeOfString:options: says:
NSStringobjects are compared by checking the Unicode canonical equivalence of their code point sequences.
So this method presumably treats combining sequences as single units by default. Here's a little Obj-C snippet to confirm the behavior you've seen from Swift:
NSString *s = @"A\u0300";
NSRange range = [s rangeOfString:@"A" options:0];
// returns { location: NSNotFound, length: 0 }, aka "not found"
This should be good news from the perspective of Swift because it means that NSString.contains(_:)'s behavior is closer to what you'd expect from String in many cases.