为什么 CGBitmapInfo 删除了 Objective-C 中的 kCGBitmapByteOrderDefault?
Why CGBitmapInfo remove the kCGBitmapByteOrderDefault which in Objective-C?
在Objective-C中,CGBitmapInfo包含:
kCGBitmapAlphaInfoMask = 0x1F,
kCGBitmapFloatInfoMask = 0xF00,
kCGBitmapFloatComponents = (1 << 8),
kCGBitmapByteOrderMask = kCGImageByteOrderMask,
kCGBitmapByteOrderDefault = (0 << 12),
kCGBitmapByteOrder16Little = kCGImageByteOrder16Little,
kCGBitmapByteOrder32Little = kCGImageByteOrder32Little,
kCGBitmapByteOrder16Big = kCGImageByteOrder16Big,
kCGBitmapByteOrder32Big = kCGImageByteOrder32Big
但是,在 Swift 3.0 中,CGBitmapInfo 删除了 kCGBitmapByteOrderDefault:
public struct CGBitmapInfo : OptionSet {
public init(rawValue: UInt32)
public static var alphaInfoMask: CGBitmapInfo { get }
public static var floatInfoMask: CGBitmapInfo { get }
public static var floatComponents: CGBitmapInfo { get }
public static var byteOrderMask: CGBitmapInfo { get }
public static var byteOrder16Little: CGBitmapInfo { get }
public static var byteOrder32Little: CGBitmapInfo { get }
public static var byteOrder16Big: CGBitmapInfo { get }
public static var byteOrder32Big: CGBitmapInfo { get }
}
这是为什么?
我可以像 CGBitmapInfo(rawValue: 0)
那样初始化 CGBitmapInfo
来替换 kCGBitmapByteOrderDefault
吗?
我可以像 CGBitmapInfo(rawValue: 0)
那样初始化 CGBitmapInfo
来替换 kCGBitmapByteOrderDefault
吗?
答案是肯定的。
Swift 在某些情况下会省略一些 0 值枚举标签。 (详细信息取决于 Swift 的版本)。
如果您发现某些枚举标签未导入Swift,请检查Objective-C中的原始来源并确认它确实具有整数值0,然后将其替换为init(rawValue: 0)
。
已添加
我找不到太多关于 的信息,这就是为什么?,您只能在 Xcode Release Notes (>Xcode 8.0>Swift) 中找到:
- The
None
members of imported NS_OPTIONS
option sets are marked as unavailable when they are imported. Use []
to make an empty
option set, instead of a None
member.
None
member 的意思还不够清楚,但是 Swift importer 的设计者似乎更喜欢空集文字 []
对于 OptionSet
类型表示 default 或 none.
因此,应修改此答案的前半部分:
你可以用CGBitmapInfo(rawValue: 0)
代替kCGBitmapByteOrderDefault
,但是空集文字是首选:
let myBitmapInfo: CGBitmapInfo = []
查看 CGBitmapInfo 或 CGImageByteOrderInfo https://developer.apple.com/documentation/coregraphics/cgimagebyteorderinfo
https://developer.apple.com/documentation/coregraphics/cgbitmapinfo
只要ByteOrderMask中的3位为0就可以了。我还没有找到任何文档说明 0 的字节顺序的作用。以下导致相同的 0 值。
let b: CGBitmapInfo = []
let b = CGBitmapInfo(rawValue: 0)
111000000000000 字节顺序掩码
您可以从
获取 ByteOrder 的可能值
001000000000000 == CGBitmapInfo.byteOrder16Little.rawValue
010000000000000 == CGBitmapInfo.byteOrder32Little.rawValue
011000000000000 == CGBitmapInfo.byteOrder16Big.rawValue
100000000000000 == CGBitmapInfo.byteOrder32Big.rawValue
示例设置值
let b: CGBitmapInfo = [ .byteOrder32Big]
print("\(b.contains(.byteOrder32Big))") // true
print("\(b.contains(.byteOrder16Little))") // false
print("\(b.rawValue)") // 16384
在Objective-C中,CGBitmapInfo包含:
kCGBitmapAlphaInfoMask = 0x1F,
kCGBitmapFloatInfoMask = 0xF00,
kCGBitmapFloatComponents = (1 << 8),
kCGBitmapByteOrderMask = kCGImageByteOrderMask,
kCGBitmapByteOrderDefault = (0 << 12),
kCGBitmapByteOrder16Little = kCGImageByteOrder16Little,
kCGBitmapByteOrder32Little = kCGImageByteOrder32Little,
kCGBitmapByteOrder16Big = kCGImageByteOrder16Big,
kCGBitmapByteOrder32Big = kCGImageByteOrder32Big
但是,在 Swift 3.0 中,CGBitmapInfo 删除了 kCGBitmapByteOrderDefault:
public struct CGBitmapInfo : OptionSet {
public init(rawValue: UInt32)
public static var alphaInfoMask: CGBitmapInfo { get }
public static var floatInfoMask: CGBitmapInfo { get }
public static var floatComponents: CGBitmapInfo { get }
public static var byteOrderMask: CGBitmapInfo { get }
public static var byteOrder16Little: CGBitmapInfo { get }
public static var byteOrder32Little: CGBitmapInfo { get }
public static var byteOrder16Big: CGBitmapInfo { get }
public static var byteOrder32Big: CGBitmapInfo { get }
}
这是为什么?
我可以像 CGBitmapInfo(rawValue: 0)
那样初始化 CGBitmapInfo
来替换 kCGBitmapByteOrderDefault
吗?
我可以像 CGBitmapInfo(rawValue: 0)
那样初始化 CGBitmapInfo
来替换 kCGBitmapByteOrderDefault
吗?
答案是肯定的。
Swift 在某些情况下会省略一些 0 值枚举标签。 (详细信息取决于 Swift 的版本)。
如果您发现某些枚举标签未导入Swift,请检查Objective-C中的原始来源并确认它确实具有整数值0,然后将其替换为init(rawValue: 0)
。
已添加
我找不到太多关于 的信息,这就是为什么?,您只能在 Xcode Release Notes (>Xcode 8.0>Swift) 中找到:
- The
None
members of importedNS_OPTIONS
option sets are marked as unavailable when they are imported. Use[]
to make an empty option set, instead of aNone
member.
None
member 的意思还不够清楚,但是 Swift importer 的设计者似乎更喜欢空集文字 []
对于 OptionSet
类型表示 default 或 none.
因此,应修改此答案的前半部分:
你可以用CGBitmapInfo(rawValue: 0)
代替kCGBitmapByteOrderDefault
,但是空集文字是首选:
let myBitmapInfo: CGBitmapInfo = []
查看 CGBitmapInfo 或 CGImageByteOrderInfo https://developer.apple.com/documentation/coregraphics/cgimagebyteorderinfo https://developer.apple.com/documentation/coregraphics/cgbitmapinfo
只要ByteOrderMask中的3位为0就可以了。我还没有找到任何文档说明 0 的字节顺序的作用。以下导致相同的 0 值。
let b: CGBitmapInfo = []
let b = CGBitmapInfo(rawValue: 0)
111000000000000 字节顺序掩码
您可以从
获取 ByteOrder 的可能值001000000000000 == CGBitmapInfo.byteOrder16Little.rawValue
010000000000000 == CGBitmapInfo.byteOrder32Little.rawValue
011000000000000 == CGBitmapInfo.byteOrder16Big.rawValue
100000000000000 == CGBitmapInfo.byteOrder32Big.rawValue
示例设置值
let b: CGBitmapInfo = [ .byteOrder32Big]
print("\(b.contains(.byteOrder32Big))") // true
print("\(b.contains(.byteOrder16Little))") // false
print("\(b.rawValue)") // 16384