【问题标题】:How to pass multiple enum values as a function parameter如何将多个枚举值作为函数参数传递
【发布时间】:2014-06-05 15:47:45
【问题描述】:

我将如何执行以下操作 - 在 swift 中将两个 NSStringDrawing 选项作为函数参数传递:

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

【问题讨论】:

    标签: swift


    【解决方案1】:

    编辑:在 Swift 3.0 中:

    let options: NSStringDrawingOptions = [.usesLineFragmentOrigin, .usesFontLeading]
    

    编辑:这就是您在 Swift 2.0 中使用选项枚举的方式

    let options: NSStringDrawingOptions = [.UsesLineFragmentOrigin, .UsesFontLeading]
    

    编辑:问题has been resolved in iOS 8.3 SDK Beta 1 (12F5027d)

    修改了NSStringDrawingOptions [struct]

    • 发件人:enum NSStringDrawingOptions : Int
    • 收件人:struct NSStringDrawingOptions : RawOptionSetType

    你现在可以写了:

    let options : NSStringDrawingOptions = .UsesLineFragmentOrigin | .UsesFontLeading
    

    经过一些研究和@Anton Tcholakov 的“评论”:

    1. 如果您的目标是 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)
      
    2. 1234563您应该向 Apple 发送一份错误报告,描述这个严重的问题。

    【讨论】:

    • 会返回什么样的绘图选项? ) 只有个别的,而不是它们的组合,所以我猜 OR 操作的结果不会通过“类型检查”
    • 抱歉,这应该是 2 个不同的选项。但这也行不通。这是一个错误。
    • @devmiles.com 看起来像 iOS SDK 中的一个错误,绝对是。 :(查看我更新的答案。
    • 不幸的是,是的。我的错误报告仍处于打开状态。
    • 在 Swift 2.0 中这不再适用。现在大多数枚举都符合OptionSetType,现在您使用与数组[.UsesLineFragmentOrigin, .UsesFontLeading] 相同的语法传递枚举值。见:stackoverflow.com/questions/30761996/…
    【解决方案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)
    

    【讨论】:

    • 我希望我能投票两次。我永远不会猜到你可以从 Objective-C 中获取一个任意整数,调用一个 NSStringDrawingOptions,然后让它通过 Swift 编译器。
    • 我最终在一个 Objective-C 文件中创建了一个常量,然后从 Swift 中引用它。希望他们能尽快解决这个问题。
    • 令人惊讶的是,这个错误仍然存​​在(iOS 8.1,Xcode 6.1GM2)。
    • 实际上,iOS SDK 8.3,而不是 Swift 1.2 修复了这个问题。 ;)
    【解决方案3】:

    另一种解决方案,使用unsafeBitCast

    如下:

    let options = unsafeBitCast(NSStringDrawingOptions.UsesLineFragmentOrigin.rawValue | 
                                NSStringDrawingOptions.UsesFontLeading.rawValue,
                                NSStringDrawingOptions.self)
    

    【讨论】:

      【解决方案4】:

      在 Swift 2.1 中我们可以使用,

      calculatedRect = (text as NSString).boundingRectWithSize(bounds.size, options: NSStringDrawingOptions([.UsesLineFragmentOrigin, .UsesFontLeading]), attributes: [NSFontAttributeName : font], context: nil)
      

      为一个参数传递多个枚举值。

      【讨论】:

        【解决方案5】:

        在 swift 2.0 中类似于

        theStringDrawingOptions = [NSStringDrawingOptions.UsesLineFragmentOrigin,
                                   NSStringDrawingOptions.UsesFontLeading]
        

        参见 2015 年 wwdc 讲座 -> 106_hd_whats_new_in_swift 6 分钟

        【讨论】:

          【解决方案6】:

          似乎无法评论 akashivskyy 的帖子(没有 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 继承的。

          【讨论】:

          • 好吧,现在你得到了 50 分)虽然我正在使用 ios,但仍然有问题(
          • 老实说,我对 Cocoa API 不太熟悉。我只是在操场上有上述内容,它似乎有效。也许其他人可以提供进一步的帮助。
          • 不,这不能在 iOS 上编译。在 iOS 上,它不是 RawOptionSet。这正是问题所在。
          【解决方案7】:

          Swift 支持 C 的按位 OR 运算符,但枚举值现在位于特定范围内,而不是简单的全局符号:

          let boundingRect = "fpp".boundingRectWithSize(CGSizeMake(280.0, CGFloat.max),
              options:NSStringDrawingOptions.UsesLineFragmentOrigin | NSStringDrawingOptions.UsesFontLeading,
              attributes:nil, context:nil)
          

          【讨论】:

          • 不幸的是,这不起作用,因为:找不到“|”的重载接受提供的参数
          • 不确定您编辑了什么,代码本身有错误,但主要流程是 |不适用于枚举:Int
          【解决方案8】:

          swift 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)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-12-04
            • 1970-01-01
            • 2012-04-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-24
            相关资源
            最近更新 更多