2016-10-20 55 views
0

我在Swift中遇到了使用泛型的問題 - 我在Java中使用泛型的經驗,並且正在努力翻譯我的知識。我有采用一個通用的參數類型,在協議中定義像這樣的方法:在使用泛型時,無法將類型'A'的值轉換爲期望的參數類型'A'

protocol Board { 
    func getPlace<T : Position>(position: T) -> Place 
} 

的想法是,在Board可具有其自己類型的Position,像一個XYPosition用於SquareBoard,但不同類型的六角板的位置。

但是,下面的操場片斷有一個很奇怪的錯誤:

/Users/Craig/projects/MyModule/Sources/SquareBoard.swift:16:39: error: cannot convert value of type 'XYPosition' to 
expected argument type 'XYPosition'                     
     let index = toIndex(position: position)                   
             ^~~~~~~~                   
               as! XYPosition 

如果我試圖迫使投position,它會變得怪異:

/Users/Craig/projects/MyModule/Sources/SquareBoard.swift:16:48: warning: forced cast of 'XYPosition' to same type h 
as no effect                           
     let index = toIndex(position: position as! XYPosition)               
               ^~~~~~~~~~~~~~               

/Users/Craig/projects/MyModule/Sources/SquareBoard.swift:16:48: error: cannot convert value of type 'XYPosition' to 
expected argument type 'XYPosition'                     
     let index = toIndex(position: position as! XYPosition)               
             ~~~~~~~~~^~~~~~~~~~~~~~               
                   as! XYPosition 

是它重新定義的類型第二次以不同的身份?我似乎無法確定我做錯了什麼。這個問題可以在下面的遊樂場中重現:

import Cocoa 

protocol Position : Equatable { 
} 

struct XYPosition : Position { 
    let x : Int 
    let y : Int 
} 

func ==(lhs: XYPosition, rhs:XYPosition) -> Bool { 
    return lhs.x == rhs.x && lhs.y == rhs.y 
} 

public class Test { 

    private func toIndex(position: XYPosition) -> Int { 
     return (position.y * 10) + position.x 
    } 

    func getPlace<XYPosition>(position: XYPosition) -> Int { 
     let index = toIndex(position: position as! XYPosition) 
     return 4 
    } 
} 

回答

1

由於您沒有發佈您的實際代碼,所以有點混淆。不知道什麼getPlace必須與你的問題,我不能確定你要完成

無論哪種方式到底是什麼,我中有你的遊樂場工作,希望你可以從那裏工作:

protocol Position : Equatable { 
    var x: Int { get } 
    var y: Int { get } 
} 

struct XYPosition : Position { 
    let x : Int 
    let y : Int 
} 

func ==(lhs: XYPosition, rhs:XYPosition) -> Bool { 
    return lhs.x == rhs.x && lhs.y == rhs.y 
} 

public class Test { 

    private func toIndex<T: Position>(position: T) -> Int { 
     return (position.y * 10) + position.x 
    } 

    func getPlace<T: Position>(position: T) -> Int { 
     let index = toIndex(position: position) 
     return index 
    } 
} 

首先,在原始getPlace<XYPosition>中,XYPosition是一個本地定義的類型,並且與您的結構無關,所以當您調用as! XYPosition時,您試圖將其轉換爲本地類型,而不是您的結構。

其次,我猜你是在誤解如何使用結構。結構不能被分類,所以你不能使用結構作爲泛型。只有一個協議或類。如果你傳遞一個結構,你可以傳遞結構本身。

相關問題