2017-12-18 10 views
0

配列のインデックスが範囲外のエラーになってしまい、この質問に遭遇しました。Swift 4では、 'Self'型の値に 'Int'型のインデックスを添字できません。

Reference link

そして、これはコードのブロックです。

import UIKit 
import Foundation 
import CoreBluetooth 

EDIT 1:レオは示唆したものから、そのエラーが範囲外、このブロックが、インデックスから消えているが、まだ

extension Collection where Index == Int { 
    func get(index: Int) -> Element? { 
     if 0 <= index && index < count { 
      return self[index] 
     } else { 
      return nil 
     } 
    } 
} 

class Sample:UIViewController{ 
    ....... 

    //This is where I'm sending data 

    func send(){ 
     if let send1 = mybytes.get(index: 2){ 
      byteat2 = bytefromtextbox 
      print(byteat2) 
     } 
    } 
} 

を持続しかし、動作するようには思えません。 私は拡張子のコレクション{にreturn self[index]でエラーが出る} 私はまた、次のことを試してみました

byteat2.insert(bytefromtextbox!, at:2) 

しかし、それは範囲エラー外のインデックスを返してきました。

誰かが助けて解決策を教えてくれますか?

+0

使用アペンドの代わりに挿入。 Btwなぜgetメソッドが必要でしょうか?配列の添え字を使用して、インデックスの値にアクセスしようとする前に配列の数を調べてください –

+0

実際にgetメソッドを実装したい場合は、インデックス 'extended Collection 'に制約を追加してindex == Int {'とし、インデックスが有効かどうかをチェックする 'return indices.contains(index)? self [index]:nil' –

+0

もう一つのオプションは、インデックスパラメータを 'Int'から' Index'に変更することです: 'extension' { func get(index:Index) - > Element? { return indices.contains(index)?自己[index]:nil } } ' –

答えて

0

insertの代わりにappendを使用し、getメソッドを作成する代わりに配列の添字を使用するだけです。インデックスの値にアクセスしようとする前に、配列の数をチェックするだけです。コレクションのインデックスにインデックスが含まれているかどうかを調べるのが良い方法です。

実際にgetメソッドを実装する場合は、 extension Collection where Index == IntまたはIntからIndexにあなたのインデックスパラメータを変更します。


extension Collection { 
    func element(at index: Index) -> Element? { 
     return indices.contains(index) ? self[index] : nil 
    } 
} 

let array = ["a","b","c","d"] 
array.element(at: 2) // "c" 
関連する問題