4615


SWiftで行の高さを、文字数によって動的に変更したいと思っております。  
対象はiOS7とiOS8のどちらにも対応予定です。

そこで以下の様なコードを書いたところエラーがでて使えませんでした。  
どちらか片方のオプションを指定して場合は問題ないのですが、今回は２つとも必要だと思われます。

let options:NSStringDrawingOptions =
(NSStringDrawingOptions.UsesLineFragmentOrigin |
NSStringDrawingOptions.UsesFontLeading)

このエラーについて調べたところどうもiOS7の不具合との情報を見かけました。  
それでこのコードの部分だけをObjective-Cのクラスとしようとしたところ、  
NSStringDrawingOptionsがExpected as typeというエラーになってしまうのですが通す方法はあるのでしょうか？

Bridging-Headerは作り、他のクラス（SDWebImage等）が無事動作していますのでその点は問題ないかと思ってます。

よろしくお願いいたします。

コードは以下になります。

DrawingOptions.h

[code]

    #import <Foundation/Foundation.h>
    @interface StringDrawingOptions : NSObject
    + (NSStringDrawingOptions)combine:(NSStringDrawingOptions)option1 with:(NSStringDrawingOptions)option2;
    @end
    
[/code]

DrawingOptions.m

[code]

    #import "StringDrawingOptions.h"
    @implementation StringDrawingOptions
    + (NSStringDrawingOptions)combine:(NSStringDrawingOptions)option1 with:(NSStringDrawingOptions)option2
    {
        return (option1 | option2);
    }
    @end
    
[/code]


CC BY-SA 3.0
2015-01-14T23:29:30.767
4575
2015-01-16T16:36:12.147
2015-01-15T12:21:59.353
5519
5589
question
ios objective-c swift
SwiftでObjective-Cのクラスを使う際にNSStringDrawingOptionsがExpected a typeというエラーになってしまう

[code]

    let options:NSStringDrawingOptions = 
        (NSStringDrawingOptions.UsesLineFragmentOrigin |
         NSStringDrawingOptions.UsesFontLeading)
    
[/code]

とりあえず、これを

[code]

    let options:NSStringDrawingOptions.RawValue =
        (NSStringDrawingOptions.UsesLineFragmentOrigin.rawValue |
         NSStringDrawingOptions.UsesFontLeading.rawValue)
    
[/code]

こう書きかえてみてください。少なくともエラーは消えるはずです。

C言語の `enum` と、 Swift の `enum` の仕様の違いを、お調べになる必要があると思います。


CC BY-SA 3.0
2015-01-15T00:17:48.657
4577
2015-01-15T00:44:49.573
2015-01-15T00:44:49.573
4978
7362
4575
answer


`Expected a
type`というエラーメッセージはDrawingOptions.hのところで出ていると思いますので、DrawingOptions.hのimport文に`#import
<UIKit/UIKit.h>`を足してください。

`NSStringDrawingOptions`はUIKitによる拡張なので、UIKitをインポートしないと、NSStringDrawingOptionsの定義が参照できません。

次に、StringDrawingOptionsが必要になるのはSwiftのバグ（厳密には`NSStringDrawingOptions`の定義がおかしい）なので、

[code]

    let options:NSStringDrawingOptions = (NSStringDrawingOptions.UsesLineFragmentOrigin | NSStringDrawingOptions.UsesFontLeading)
    
[/code]

の箇所を

[code]

    let options = StringDrawingOptions.combine(.UsesLineFragmentOrigin, with: .UsesFontLeading)
    
[/code]

と、StringDrawingOptionsで定義した、Objective-Cのメソッドを使ってビットマスクを計算するようにします。


CC BY-SA 3.0
2015-01-15T12:07:28.750
4615
2015-01-15T12:07:28.750
5519
4575
answer


SwiftのEnum定義の中で列挙されてる値以外の値が入ったEnumオブジェクトを  
Swiftでは作らせてもらえないようなので、  
Objective-Cを経由して作ってしまうやりかたですね。本家で見たような気がします。

ですが、Swiftだけでも実は緊急手段の無理矢理キャストは可能です。

[code]

    let options = unsafeBitCast(NSStringDrawingOptions.UsesLineFragmentOrigin.rawValue |
     NSStringDrawingOptions.UsesFontLeading.rawValue, NSStringDrawingOptions.self)
    
[/code]

こちらの方が危険なところに危険と書いてある分オススメです。


CC BY-SA 3.0
2015-01-16T16:36:12.147
4705
2015-01-16T16:36:12.147
5290
4575
answer