32204


プロトコルについて勉強をしていますが、何かもう一つ理解ができません。  
下記は、数値の範囲をコードポイントと見立てて、指定されたコードポイントを文字に表示する  
関数をジェネリックにしたいと思っています。  
指定された数値を、Int型にして、コードポイントに変換して表示しようと思っていますが、  
条件の立て方が分かりません。下記のコードでは、T型をIntegerプロトコル適合したところで、Intのイニシャライザでは、どの型になるのか（またはIntegerプロトコルから作成した型を独自に作成した場合もある）が分からないので、コンパイルが通らないことは理解できました。  
が、問題が解決できません。UInt8,UInt16,UInt32,Int型に対応したいと思っています。

[code]

    func codePointToMoji<T:Integer>(_ range:CountableClosedRange<T>)->Void{
    
        for c in range
        {
             let codePoint = Int(c)
             let d = UnicodeScalar(codePoint) 
             if let s = d{
                print(s)
             }
        }
    }
    
    
    var a = (0 as UInt8)...71
    var b = (48165 as UInt16)...48170
    var c = 0x0300...0x036F
    
    
    
    codePointToMoji(a)
    codePointToMoji(b)
    codePointToMoji(c)
    
[/code]


CC BY-SA 3.0
2017-01-27T08:10:56.747
32197
2017-01-28T06:32:19.973
11148
question
swift swift3
プロトコルを条件で使うには


このように変更を加えると、エラーなしで実行できるようになりました。

[code]

    func codePointToMoji<T:Integer>(_ range:CountableClosedRange<T>)->Void{
    
        for c in range
        {
            let codePoint = Int(c.toIntMax()) // 変更
            let d = UnicodeScalar(codePoint)
            if let s = d{
                print(s)
            }
        }
    }
    
    
    var a = (0 as UInt8)...71
    var b = (48165 as UInt16)...48170
    var c = 0x0300...0x036F
    
    
    
    codePointToMoji(a)
    codePointToMoji(b)
    codePointToMoji(c)
    
[/code]

`toIntMax()`は、`Integer`プロトコルがInheritしている`_Integer`プロトコルがInheritしている`IntegerArithmetic`プロトコルが実装しています。`IntMax`型の整数値を返し、`IntMax`型は、`Int64`のTypeAliasです。そのままでは`UnicodeScalar`のイニシアライザに渡せないので、`Int()`で変換しています。この`toIntMax()`メソッドは、重要なキーワードのような気がしています。


CC BY-SA 3.0
2017-01-27T10:47:40.777
32204
2017-01-28T06:32:19.973
2017-01-28T06:32:19.973
18540
18540
32197
answer