Подтвердить что ты не робот

Как передать несколько значений enum в качестве параметра функции

Как бы я сделал следующее: передача двух параметров NSStringDrawing в качестве параметра функции в swift:

CGRect boundingRect = [string boundingRectWithSize:CGSizeMake(280.0, NSIntegerMax)
                                                      options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
                                                   attributes:options context:nil];
4b9b3361

Ответ 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)