Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何将多个枚举值作为函数参数传递_Swift - Fatal编程技术网

Swift 如何将多个枚举值作为函数参数传递

Swift 如何将多个枚举值作为函数参数传递,swift,Swift,如何执行以下操作-在swift中将两个NSStringDrawing选项作为函数参数传递: CGRect boundingRect = [string boundingRectWithSize:CGSizeMake(280.0, NSIntegerMax) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUses

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

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

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

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

编辑:在Swift 3.0中:

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

编辑:这是如何使用Swift 2.0中的选项枚举:

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

编辑:问题

let options: NSStringDrawingOptions = [.UsesLineFragmentOrigin, .UsesFontLeading]
修改了
NSStringDrawingOptions
[struct]

  • From:
    enum NSStringDrawingOptions:Int
  • 收件人:
    struct NSStringDrawingOptions:RawOptionSetType
你现在可以写:

let options : NSStringDrawingOptions = .UsesLineFragmentOrigin | .UsesFontLeading

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

  • 如果您的目标是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中(在当前的seed中),有一个bug,
    NSStringDrawingOptions
    作为
    enum:Int
    移植到Swift,而不是
    struct:RawOptionSet
    。你应该向苹果发送一份bug报告,描述这个严重的问题


  • 似乎无法对Akashivsky的帖子发表评论(没有获得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继承而来。

    更新了Xcode 6.3的答案:

    在Xcode 6.3测试版(Swift 1.2)中,这一问题最终得到了解决,您现在可以这样做:

    let boundingRect = "string".boundingRectWithSize(size, options: .UsesLineFragmentOrigin | .UsesFontLeading, attributes:nil, context:nil)
    
    对于旧版本:

    它看起来像是当前beta版中的一个bug,现在我编写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)
    

    另一种解决方案是使用
    unsafeBitCast

    如下图所示:

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

    在swift 2.0中,这将类似于

    theStringDrawingOptions = [NSStringDrawingOptions.UsesLineFragmentOrigin,
                               NSStringDrawingOptions.UsesFontLeading]
    

    请参阅swift 2.1中我们可能使用的6分钟内的讲座wwdc 2015->106_hd_What_new____swift

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

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

    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)
    

    不幸的是,这不起作用,因为:找不到接受提供的参数的“|”重载。不确定您编辑了什么,代码本身有错误,但主要流程是|不适用于enum:int(返回哪种图形选项?)只有单独的选项,而不是它们的组合,因此OR操作的结果不会通过“类型检查”。对不起,这应该是两个不同的选项。但这也行不通。这是一个bug。@devmiles.com看起来确实像iOS SDK中的bug:(请查看我的更新答案。很遗憾,是的。我的错误报告仍在打开。在Swift 2.0中,这不再是真的。现在大多数枚举符合
    选项settype
    ,现在您使用数组的相同语法传递枚举值
    [.UsesLineFragmentOrigin.usesfulleding]
    。请看:现在您得了50分)虽然我在使用ios,但仍然有问题(老实说,我对Cocoa API不太熟悉。我只是在操场上有上面提到的,而且似乎很有效。也许其他人可以提供进一步的帮助。不,这在iOS上无法编译。在iOS上,这不是RawOptiStart。这正是问题所在。我希望我能投票两次。我从来没有想到你可以从Obj中获取任意整数ective-C,称之为NSStringDrawingOptions,并通过Swift编译器。我最终在Objective-C文件中创建了一个常量,并从Swift中引用了它。希望他们能很快解决这个问题。令人惊讶的是,这个错误仍然存在(iOS 8.1,Xcode 6.1GM2)。实际上,iOS SDK 8.3,而不是Swift 1.2解决了这个问题。;)