2017-09-08 4 views
0

L'équivalent de ce code dans Swift:SceneKit: équivalent de SCNVector3 (0, 0, 0) en Objective C

startNode.scale = SCNVector3(1/100.0, 1/100.0, 1/100.0) 

est:

[startNode setScale: SCNVector3Make(1/100.0, 1/100.0, 1/100.0)]; 

en Objective-C.

Il semble étrange que SCNVector3 devrait être remplacé par SCNVector3Make. Pourquoi est-ce?

Merci!

+0

Alors SCNVector3 et SCNVector3Make sont strictement équivalents dans Swift? –

Répondre

1

Vous pouvez utiliser SCNVector3Make(x, y, z) et SCNVector3(x, y, z) dans Swift.

Ce dernier est, en effet, étrange dans la sémantique, mais ils sont identiques.

+0

Pourquoi est-ce étrange? Il suit toutes les normes de conversion de noms entre l'API de fonction C et l'API Swift. – user28434

+0

@ user28434 Vérifiez l'initialiseur 'CGPoint' ou' CGRect'; ils ont tous des noms de paramètres externes, contrairement à 'SCNVector3 (x, y, z)'. – the4kman

+0

En effet. Bien que "SCNVector3" ait un initialiseur Swift avec des noms de paramètres pour "Float". Mais je pense que OP se demande pourquoi 'SCNVector3' est' SCNVector3Make' dans Objective C, pas pourquoi il n'y a pas de noms de paramètres. – user28434

1

Les deux sont les mêmes, seuls les noms sont différents et tous parce que les conventions de dénomination de différence dans les frameworks Apple C/ObjC et le code Swift.


Il serait préférable de montrer comment il fonctionne sur exemple:

Supposons que nous créons le cadre SomeFramework (SF serait alors préfixe d'espace de noms) et dans ledit cadre, nous aurons le type Example, avec le préfixe ce serait SFExample.

La convention de dénomination pour C indique que le constructeur pour notre type SFExample devrait être appelé SFExampleMake.

La convention de dénomination pour Swift indique que le constucteur doit être SFExample.init, qui peut être appelé SFExample(…).

Et quand vous importez des cadres ObjC/C dans votre projet Swift il y a namecast derrière la scène qui se SFExampleMake à SFExample.init ou SCNVector3Make à SCNVector3.init.