Как передать несколько значений enum в качестве параметра функции
Как бы я сделал следующее: передача двух параметров NSStringDrawing в качестве параметра функции в swift:
CGRect boundingRect = [string boundingRectWithSize:CGSizeMake(280.0, NSIntegerMax)
options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
attributes:options context:nil];
Ответы
Ответ 1
Изменить: В Swift 3.0:
let options: NSStringDrawingOptions = [.usesLineFragmentOrigin, .usesFontLeading]
Изменить: Вот как вы можете использовать перечисление параметров в Swift 2.0:
let options: NSStringDrawingOptions = [.usesLineFragmentOrigin, .usesFontLeading]
Изменить: Проблема была решена в iOS 8.3 SDK Beta 1 (12F5027d):
Изменено NSStringDrawingOptions
[struct]
- От:
enum NSStringDrawingOptions : Int
- Кому:
struct NSStringDrawingOptions : RawOptionSetType
Теперь вы можете написать:
let options : NSStringDrawingOptions = .UsesLineFragmentOrigin | .UsesFontLeading
После некоторых исследований и @Anton Chcholakov "комментарий":
-
Если вы ориентируетесь на OS X 10.10, это будет как простой способ сделать это:
let size = CGSize(width: 280, height: Int.max)
let options : NSStringDrawingOptions = .UsesLineFragmentOrigin | .UsesFontLeading
let boundingRect = string.bridgeToObjectiveC().boundingRectWithSize(size, options: options, attributes: attributes, context: nil)
-
Однако в iOS 8 SDK (в текущем семени) есть ошибка, где NSStringDrawingOptions
переносится на Swift как enum : Int
вместо struct : RawOptionSet
. Вы должны отправить отчет об ошибке в Apple, описывающий эту серьезную проблему.
Ответ 2
Обновленный ответ для Xcode 6.3:
в Xcode 6.3 Beta (Swift 1.2) это, наконец, исправлено, вы можете сделать это сейчас следующим образом:
let boundingRect = "string".boundingRectWithSize(size, options: .UsesLineFragmentOrigin | .UsesFontLeading, attributes:nil, context:nil)
Для старой версии:
Похоже на ошибку в текущей бета-версии, теперь я пишу метод Objective-C и использую его из Swift:
+ (NSStringDrawingOptions)combine:(NSStringDrawingOptions)option1 with:(NSStringDrawingOptions)option2
{
return option1 | option2;
}
и форму вызова Swift:
let boundingRect = "string".boundingRectWithSize(size, options: StringDrawingOptions.combine(.UsesLineFragmentOrigin, with: .UsesFontLeading), attributes:nil, context:nil)
Ответ 3
Другое решение, используйте unsafeBitCast
.
Как ниже:
let options = unsafeBitCast(NSStringDrawingOptions.UsesLineFragmentOrigin.rawValue |
NSStringDrawingOptions.UsesFontLeading.rawValue,
NSStringDrawingOptions.self)
Ответ 4
в swift 2.0, который будет чем-то вроде
theStringDrawingOptions = [NSStringDrawingOptions.UsesLineFragmentOrigin,
NSStringDrawingOptions.UsesFontLeading]
см. лекцию wwdc 2015 → 106_hd_whats_new_in_swift за 6 минут
Ответ 5
В Swift 2.1 мы можем использовать
calculatedRect = (text as NSString).boundingRectWithSize(bounds.size, options: NSStringDrawingOptions([.UsesLineFragmentOrigin, .UsesFontLeading]), attributes: [NSFontAttributeName : font], context: nil)
передать несколько значений enum для параметра.
Ответ 6
Кажется, не комментирует акашивский пост (не получил 50+ репутации), но это, похоже, работает на моем конце:
import Cocoa
let drawingOpts : NSStringDrawingOptions = .UsesLineFragmentOrigin | .UsesFontLeading
let boundingRect = "test".bridgeToObjectiveC().boundingRectWithSize(CGSize(width: 280, height: Int.max), options: drawingOpts, attributes: nil)
Также, если я Cmd + щелкните NSStringDrawingOptions, я вижу его как наследование от RawOptionSet.
Ответ 7
Swift поддерживает оператор C побитового OR, но значения перечисления теперь находятся в определенной области, а не просто являются глобальными символами:
let boundingRect = "fpp".boundingRectWithSize(CGSizeMake(280.0, CGFloat.max),
options:NSStringDrawingOptions.UsesLineFragmentOrigin | NSStringDrawingOptions.UsesFontLeading,
attributes:nil, context:nil)
Ответ 8
В быстрой 4. 0+ мы можем передать несколько вариантов, как это, это работает для меня
let options = NSStringDrawingOptions(rawValue: NSStringDrawingOptions.usesLineFragmentOrigin.rawValue | NSStringDrawingOptions.usesFontLeading.rawValue)
let boundingRect = string._bridgeToObjectiveC().boundingRect(with: CGSize(width: 280, height: Int.max), options: options, attributes: [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 19.0)], context: nil)