2016-11-24 8 views
-1

У меня есть словарь, который используется в качестве ключа NSIndexPath. Он отлично работает с Swift 2, но я не могу найти решение, чтобы заставить его работать с Swift 3. Я не хочу использовать String в качестве ключа, поэтому, пожалуйста, не предлагайте этого.Получите значение словаря в Swift 3, который не является строкой

// init 
fileprivate var cachedCellSizes: [NSIndexPath: CGSize] = [:] 

// get value 
if let size = cachedCellSizes[indexPath] { 
    return size 
} 

Compiler ошибка:

Ambiguous reference to member 'subscript' 

Некоторые решения я пытался, но не работает:

if let size:CGSize = cachedCellSizes[indexPath] as? CGSize { 
    return size 
} 
if let size:CGSize = cachedCellSizes[indexPath] as! CGSize { 
    return size 
} 
if let size:CGSize = cachedCellSizes["indexPath"] as CGSize { 
    return size 
} 
+3

Пожалуйста, проверьте ю на вашем indexPath на самом деле 'NSIndexPath'. Coz Swift 3 использует 'IndexPath' (не' NSIndexPath') в методах делегата таблицы. Если это так, вы можете использовать 'if let size = cachedCellSizes [indexPath as! NSIndexPath] 'или заменить словарь ключом как' IndexPath' – RJE

ответ

1
fileprivate var cachedCellSizes: [NSIndexPath: CGSize] = [:] 

if let size = cachedCellSizes[indexPath as NSIndexPath] { 
    print(indexPath) 
} 

ИЛИ

fileprivate var cachedCellSizes: [IndexPath: CGSize] = [:] 

if let size = cachedCellSizes[indexPath] { 
    print(indexPath) 
} 
+1

первый решил мою проблему, спасибо! – HoangNA

+1

Предпочтительным является второй способ. – Alexander

+0

@ АлександрМомчлов прав, второй предпочтительнее, так как вы используете Swift 3. – Callam