2017-06-01 4 views
1

ich einen Swift 3.1 NSString Erweiterung haben, die wie folgt aussieht:Automatisch generierte Swift-Erweiterungsfunktionen mit Enum Parameter

enum MLCCapitalization : Int { 
    case upperCase 
    case lowerCase 
    case na 
} 

extension NSString { 

    func MLC_stringByCapitalizingFirstLetterWithCapitalization(_ capitalization: MLCCapitalization, locale: Locale) -> NSString { 
     let firstWordRange = rangeOfCharacter(from: CharacterSet.letters) 
     guard firstWordRange.location != NSNotFound && capitalization != .na else { 
      return self 
     } 

     let firstLetterRange = NSMakeRange(firstWordRange.location, 1) 
     var firstLetter = substring(with: firstLetterRange) 

     switch capitalization { 
     case .upperCase: 
      firstLetter = firstLetter.uppercased(with: locale) 
     case .lowerCase: 
      firstLetter = firstLetter.lowercased(with: locale) 
     case .na: 
      break 
     } 

     return replacingCharacters(in: firstLetterRange, with: firstLetter) as NSString 
    } 
} 

Ich versuche, das von Objective-C zu nennen, aber diese Funktion nicht in automatisch generierte wird mein Projektname-Swift.h-Header-Datei. Es sieht aus wie diese

@interface NSString (SWIFT_EXTENSION(ProjectName)) 
@end 

Es scheint, als ob die Enum Parameter in dieser Erweiterungsfunktion das Problem verursacht (wenn ich es in ein Int ändern, wird es erzeugt.) In Swift Dies funktionierte gut 3,0. Was vermisse ich?

+0

Wenn Sie etwas mit Obj-C aussetzen wollen, sollten Sie es als '@ objc' markieren;) – Hamish

+0

Uhmmm ... das ist eine Erweiterung einer Systemklasse, nicht meine eigene Klasse. Und diese Erweiterung öffentlich zu machen, hilft nicht. – ASchuerholz

+0

Ja, aber weil 'MLCCapitalization' nicht als' @objc' gekennzeichnet ist, wird Ihre Methode nicht als '@ objc' bezeichnet. Sie sollten * sowohl * MLCCapitalisation' als auch die Methode als '@ objc' (' public' ist irrelevant) markieren, zumal die Methoden, die zu 'NSObject' abgeleiteten Klassen hinzugefügt werden, nicht mehr standardmäßig Obj-Cin ausgesetzt werden Swift 4. – Hamish

Antwort

0

Also die Antwort hier ist die Enum aus meiner Swift-Erweiterungsdatei zu entfernen und es in eine Objective-C-Header-Datei. Diese Objc-Header-Datei kann in die Bridging-Header-Datei aufgenommen werden, so dass sie auch für Swift verfügbar ist. Das zu tun, was @ Hamish vorgeschlagen hat, hätte funktioniert, wenn ich die Enum in einigen meiner Objective-C-Header-Dateien nicht verwenden müsste. Ohne die Enumeration in der Swift-Erweiterungsdatei müssen die Funktionen nicht mit @objc markiert werden. Danke an @ Hamish dafür, dass er mich in die richtige Richtung weist.

Verwandte Themen