
[code]

    //Foundation フレームワークを読み込む
    import Foundation
    
    var str = "New power of String!"
    
    // substringFromIndexは、Foundationがないと使えない
    str.substringFromIndex(advance(str.startIndex, 4)) //"power of String!"になる
    
[/code]

"power of String"になりません。  
Advanceにエラーと表示されてしまいます。ググってみましたが、適正な回答がありません。  
どうすればいいのかわかりません、よろしくお願いします。


CC BY-SA 3.0
2017-03-10T11:35:56.730
33245
2017-10-13T06:17:04.920
2017-03-11T13:35:19.390
5519
21007
question
swift swift3
StringIndexのadvanceメソッドがコンパイルエラーになる


掲示のコードは、Swift 2以前の書式に基づくものだと思われます。Swift3では、こう書きます。

[code]

    import Foundation
    
    var str = "New power of String!"
    let newString = str.substring(from: str.index(str.startIndex, offsetBy: 4))
    print(newString)
    // 出力：power of String!
    
[/code]

Swift2からSwift3への移行で、関数、メソッドの書式の変化には、たとえば`substringFromIndex`というメソッド名では、`FromIndex`の部分を、引数のラベルに移そうという傾向が見られます。また、独立関数の数を減らし、メソッドに移行しようという傾向もあります。`advance`という独立関数は、String型のメソッド`index(_
i: String.Index, offsetBy n: String.IndexDistance)`に変わっています。

* * *

[Swift.org](https://swift.org/blog/swift-4-0-release-process/)  
Swift開発者から直接発信された情報によると、今年秋頃にSwift
4がリリースされる予定になっていて、Swiftの文法の変化は、まだ終わりそうにありません。とくに`String`型について、大幅な改変が予定されていると、その情報には書かれています。それは、今回の例を見てもわかるように、文字列の5文字目から後を取り出す、1行のコードを書くのに、`str.`を3回も書かなければいけないというのは、洗練という言葉からかけ離れたものと言わなければならず、むしろどうにかしてほしい箇所です。  
変化の激しい状況下では、日本語に情報を限定するのは無理があるといえます。AppleやSwift開発者からの、直接情報をあたるのが最善の手段であり、英語だからといって、敬遠している場合ではないと、考えたほうがいいでしょう。  
もうひとつ、Swift2のコードをSwift3のコードに書き換えるのに、Xcode
8の、コンバート機能を活用することを、検討してください。Editメニュー＞Convert＞Edit Current Swift
Syntax...で一括変換が行えます。今回のコードでは変換は成功せず、完璧とはいえませんが、8割程度の期待をしてもいいという実感があります。


CC BY-SA 3.0
2017-03-10T12:23:59.353
33247
2017-03-10T23:47:30.240
2017-03-10T23:47:30.240
18540
18540
33245
answer