2015-06-28 70 views
1

Swift在類型檢查時找不到我的類型。我使用的函數指針數組,像這樣:Swift函數指針數組給出編譯器段錯誤11

var directionFuncs = Array< (Tile) -> Tile? >() 

init(player1: TileType, player2: TileType) 
{ 
    self.player1Type = player1 
    self.player2Type = player2 
    tileArray[3, 3] = Tile(column: 3, row: 3, tileType: TileType.Regular, id: 0) 
    //order matters here because we do opposite directions 
    directionFuncs.append(tileAbove) 
    directionFuncs.append(tileBelow) 
    directionFuncs.append(tileRight) 
    directionFuncs.append(tileLeft) 
    directionFuncs.append(tileAboveRight) 
    directionFuncs.append(tileBelowLeft) 
    directionFuncs.append(tileBelowRight) 
    directionFuncs.append(tileAboveLeft) 
} 

它錯誤,當我嘗試使用這樣的:這個代碼,我用一個for循環像以前一樣奇怪

for var i=0; i<8; i+=2 
     { 
      t1 = directionFuncs[i](tile) //compiler complains about this line here 
      if t1 != nil && !t1!.trapped && t1!.playerID != tile.playerID && !t1!.isMiddle() 
      { 
       //opposite direction 
       t2 = directionFuncs[i+1](tile) 
       if t2 != nil && !t2!.trapped && t2!.playerID != tile.playerID && !t2!.isMiddle() 
       { 
        tilesTrapped.append(tile) 
        increaseScore(t1!.playerID) 
        break 
       } 
      } 
     } 

,在一個循環這個代替它工作正常:做這些事情的時候

for moveDirection in directionFuncs 

編譯器賽格故障:

  1. 雖然類型檢查 'checkForTrap' 在blah.swift:91:5
  2. 雖然在blah.swift類型檢查表達式:118:17 - 線:118:44] RangeText = 「T1 = directionFuncsi」

1引用存在#2的函數。這裏沒有任何回覆聲明讓我困惑。以下是跟蹤:

0 swift     0x00000001099a02b8 llvm::sys::PrintStackTrace(__sFILE*) + 40 
1 swift     0x00000001099a0794 SignalHandler(int) + 452 
2 libsystem_platform.dylib 0x00007fff834aff1a _sigtramp + 26 
3 libsystem_platform.dylib 0x00007fff56977dd0 _sigtramp + 3545005776 
4 swift     0x000000010a05f44a swift::TypeBase::isEqual(swift::Type) + 26 
5 swift     0x0000000109ec6cb0 std::__1::__function::__func<(anonymous namespace)::favorMatchingOverloadExprs(swift::ApplyExpr*, swift::constraints::ConstraintSystem&)::$_2, std::__1::allocator<(anonymous namespace)::favorMatchingOverloadExprs(swift::ApplyExpr*, swift::constraints::ConstraintSystem&)::$_2>, bool (swift::ValueDecl*)>::operator()(swift::ValueDecl*&&) + 96 
6 swift     0x0000000109ec680b (anonymous namespace)::favorCallOverloads(swift::ApplyExpr*, swift::constraints::ConstraintSystem&, std::__1::function<bool (swift::ValueDecl*)>, std::__1::function<void (swift::TypeVariableType*, llvm::ArrayRef<swift::constraints::Constraint*>, llvm::SmallVectorImpl<swift::constraints::Constraint*>&)>) + 411 
7 swift     0x0000000109ec5eee (anonymous namespace)::ConstraintOptimizer::walkToExprPre(swift::Expr*) + 1886 
8 swift     0x0000000109fe6a50 (anonymous namespace)::Traversal::visit(swift::Expr*) + 5904 
9 swift     0x0000000109fe2f75 swift::Expr::walk(swift::ASTWalker&) + 53 
10 swift     0x0000000109ec0e29 swift::constraints::ConstraintSystem::optimizeConstraints(swift::Expr*) + 1529 
11 swift     0x0000000109ec07e2 swift::constraints::ConstraintSystem::generateConstraints(swift::Expr*) + 194 
12 swift     0x0000000109f004e3 swift::TypeChecker::typeCheckExpression(swift::Expr*&, swift::DeclContext*, swift::Type, swift::Type, bool, swift::FreeTypeVariableBinding, swift::ExprTypeCheckListener*) + 499 
13 swift     0x0000000109f46969 swift::ASTVisitor<(anonymous namespace)::StmtChecker, void, swift::Stmt*, void, void, void, void>::visit(swift::Stmt*) + 505 
14 swift     0x0000000109f46d1a swift::ASTVisitor<(anonymous namespace)::StmtChecker, void, swift::Stmt*, void, void, void, void>::visit(swift::Stmt*) + 1450 
15 swift     0x0000000109f468bf swift::ASTVisitor<(anonymous namespace)::StmtChecker, void, swift::Stmt*, void, void, void, void>::visit(swift::Stmt*) + 335 
16 swift     0x0000000109f46ab1 swift::ASTVisitor<(anonymous namespace)::StmtChecker, void, swift::Stmt*, void, void, void, void>::visit(swift::Stmt*) + 833 
17 swift     0x0000000109f468bf swift::ASTVisitor<(anonymous namespace)::StmtChecker, void, swift::Stmt*, void, void, void, void>::visit(swift::Stmt*) + 335 
18 swift     0x0000000109f454b3 swift::TypeChecker::typeCheckFunctionBodyUntil(swift::FuncDecl*, swift::SourceLoc) + 371 
19 swift     0x0000000109f45bb6 swift::TypeChecker::typeCheckAbstractFunctionBody(swift::AbstractFunctionDecl*) + 150 
20 swift     0x0000000109ef5c4d typeCheckFunctionsAndExternalDecls(swift::TypeChecker&) + 221 
21 swift     0x0000000109ef6665 swift::performTypeChecking(swift::SourceFile&, swift::TopLevelContext&, swift::OptionSet<swift::TypeCheckingFlags, unsigned int>, unsigned int) + 1333 
22 swift     0x00000001095aad85 swift::CompilerInstance::performSema() + 2661 
23 swift     0x0000000109288ef7 frontend_main(llvm::ArrayRef<char const*>, char const*, void*) + 2151 
24 swift     0x00000001092884e6 main + 1814 
25 libdyld.dylib   0x00007fff8eb7f5c9 start + 1 
+2

你能發表確切的錯誤信息嗎?我不能重現該問題... – luk2302

+0

@ luk2302我編輯了我的帖子。這有幫助嗎?我還應該注意到,我現在在Swift 1.2中,並且這在12月(在Swift 1.1之前)並不是錯誤的。 – dem7w2

回答

0

解決了這個問題,並帶有一個額外的變量。

//t1 = directionFuncs[i](tile) //this breaks everything. 
var dir = directionsFuncs[i] 
t1 = dir(tile)