[swift-users] Equivalent of NS_SWIFT_UNAVAILABLE for non-methods?

Matteo matteo at mimecastercentral.com
Wed Jul 6 05:03:47 CDT 2016


Suppose I have an existing enum in Obj-C such as:

typedef NS_OPTIONS(NSInteger, FoodType)
{
    dairyFood   = 1 << 0,
    meatFood    = 1 << 1,
    mushroomFood = 1 << 2
};

I want to rename all the values so that swift code can use the shorter names. i.e

typedef NS_OPTIONS(NSInteger, FoodType)
{
    FoodDairy = 1 << 0,
    FoodMeat = 1 << 1,
    FoodMushroom = 1 << 2
};

generates:

public struct FoodType : OptionSetType {
    public init(rawValue: Int)
 
    public static var Dairy: FoodType { get }
    public static var Meat: FoodType { get }
    public static var Mushroom: FoodType { get }
}


But I still want the old names so as not to have to update all of the existing Obj-C code and mess up my SVN history.

At first I thought this would suffice:

typedef NS_OPTIONS(NSInteger, FoodType)
{
    FoodDairy = 1 << 0,
    FoodMeat = 1 << 1,
    FoodMushroom = 1 << 2,

// Old names
dairyFood = FoodDairy,
meatFood = FoodMeat,
mushroomFood = FoodMushroom 
};

but that prevents the generated interface using the shortened names since all the values don’t follow the same pattern:

public struct FoodType : OptionSetType {
    public init(rawValue: Int)
    
    public static var FoodDairy: FoodType { get }
    public static var FoodMeat: FoodType { get }
    public static var FoodMushroom: FoodType { get }
    
    public static var dairyFood: FoodType { get }
    public static var meatFood: FoodType { get }
    public static var mushroomFood: FoodType { get }
}

I was looking for something similar to NS_SWIFT_UNAVAILABLE such that I could do:

typedef NS_OPTIONS(NSInteger, FoodType)
{
    FoodDairy = 1 << 0,
    FoodMeat = 1 << 1,
  FoodMushroom = 1 << 2,
  
  // Old names
  dairyFood = FoodDairy NS_SWIFT_UNAVAILABLE,
  meatFood = FoodMeat NS_SWIFT_UNAVALIBLE,
  mushroomFood = FoodMushroom NS_SWIFT_UNAVAILABLE
};

but NS_SWIFT_UNAVAILABLE can’t be used in this case.

So the only thing I seem to be able to do is #define the old names to the new names:
#define dairyFood   FoodDairy
etc etc

which hides them from the generated interface, but exposes those defines to the rest of the code and in a few cases caused unwanted substitutions to happen.

Is a non-#define way of doing this possible?

Cheers



More information about the swift-users mailing list