පරමාර්ථ-සී හි නියතයන්


1006

මම කොකෝවා යෙදුමක් සංවර්ධනය කරමින් සිටිමි , NSStringමගේ මනාපයන් සඳහා ප්‍රධාන නම් ගබඩා කිරීමේ ක්‍රම ලෙස මම නියත s භාවිතා කරමි.

මෙය හොඳ අදහසක් බව මට වැටහී ඇති බැවින් අවශ්‍ය නම් යතුරු පහසුවෙන් වෙනස් කිරීමට ඉඩ සලසයි.
ඊට අමතරව, එය 'ඔබේ තර්කනයෙන් ඔබේ දත්ත වෙන් කරන්න' යන සංකල්පයයි.

කෙසේ වෙතත්, සමස්ත යෙදුම සඳහා මෙම නියතයන් එක් වරක් නිර්වචනය කිරීමට හොඳ ක්‍රමයක් තිබේද?

පහසු සහ බුද්ධිමත් ක්‍රමයක් ඇති බව මට විශ්වාසයි, නමුත් දැන් මගේ පන්ති ඔවුන් භාවිතා කරන ඒවා නැවත අර්ථ දක්වයි.


7
OOP යනු ඔබේ තර්කනය සමඟ ඔබේ දත්ත කාණ්ඩගත කිරීමයි. ඔබ යෝජනා කරන්නේ හොඳ ක්‍රමලේඛ පුහුණුවක් පමණි, එනම් ඔබේ වැඩසටහන වෙනස් කිරීම පහසු කරයි.
රෆි ඛට්චඩූරියන්

Answers:


1290

ඔබ වැනි ශීර්ෂ ගොනුවක් සෑදිය යුතුය

// Constants.h
FOUNDATION_EXPORT NSString *const MyFirstConstant;
FOUNDATION_EXPORT NSString *const MySecondConstant;
//etc.

( ඔබේ කේතය මිශ්‍ර සී / සී ++ පරිසරවල හෝ වෙනත් වේදිකාවල භාවිතා නොකරන්නේ නම් externඒ වෙනුවට ඔබට භාවිතා කළ හැකිය FOUNDATION_EXPORT)

නියතයන් භාවිතා කරන සෑම ගොනුවකම හෝ ව්‍යාපෘතිය සඳහා පෙර සම්පාදනය කළ ශීර්ෂයේ ඔබට මෙම ගොනුව ඇතුළත් කළ හැකිය.

ඔබ මෙම නියතයන් .m ගොනුවක අර්ථ දක්වයි

// Constants.m
NSString *const MyFirstConstant = @"FirstConstant";
NSString *const MySecondConstant = @"SecondConstant";

Constants.m ඔබේ යෙදුමේ / රාමුවේ ඉලක්කයට එකතු කළ යුතු අතර එමඟින් එය අවසාන නිෂ්පාදනයට සම්බන්ධ වේ.

නියතයන් වෙනුවට නූල් නියතයන් භාවිතා කිරීමේ වාසිය #defineනම්, ඔබට stringInstance == MyFirstConstantනූල් සංසන්දනය ( [stringInstance isEqualToString:MyFirstConstant]) ට වඩා වේගවත් වන (සහ කියවීමට පහසු, IMO) දර්ශක සංසන්දනය ( ) භාවිතා කර සමානාත්මතාවය සඳහා පරීක්ෂා කළ හැකිය .


67
නිඛිල නියතයක් සඳහා එය වනුයේ: බාහිර int const MyFirstConstant = 1;
ඩෑන් මෝගන්

180
සමස්තයක් වශයෙන්, එක් පැහැදිලි අවවාදයකින් විශිෂ්ට පිළිතුර: මතක ලිපිනය පරීක්ෂා කරන බැවින්, පරමාර්ථ-සී හි == ක්‍රියාකරු සමඟ නූල් සමානාත්මතාවය පරීක්ෂා කිරීමට ඔබට අවශ්‍ය නැත. සෑම විටම -isEqualToString භාවිතා කරන්න: මේ සඳහා. MyFirstConstant සහ [NSString stringWithFormat: MyFirstConstant] සංසන්දනය කිරීමෙන් ඔබට පහසුවෙන් වෙනත් අවස්ථාවක් ලබා ගත හැකිය. වචනයේ පරිසමාප්ත අර්ථයෙන්ම පවා ඔබ සතුව ඇති නූලක් ගැන උපකල්පනය නොකරන්න. (ඕනෑම අවස්ථාවක, #define එසේ කවර ක්රමයක් සම්පාදකවරයා අවසානයේ දී වැලක් ප්රායෝගික දකින වූ "preprocessor උපදෙස්" වන අතර, සංගෘහිත කිරීම පෙර ආදේශ වී ඇත.)
ක්වින් ටේලර්

74
මෙම අවස්ථාවෙහිදී, නියත සංකේතයක් ලෙස සැබවින්ම භාවිතා කරන්නේ නම්, නියතය සමඟ සමානාත්මතාවය පරීක්ෂා කිරීම සඳහා == භාවිතා කිරීම හරි ය (එනම් My "MyFirstConstant" අඩංගු නූලක් වෙනුවට MyFirstConstant සංකේතය භාවිතා කරයි). මෙම අවස්ථාවෙහිදී නූලක් වෙනුවට පූර්ණ සංඛ්‍යාවක් භාවිතා කළ හැකිය (ඇත්ත වශයෙන්ම, ඔබ කරන්නේ එයයි - දර්ශකය පූර්ණ සංඛ්‍යාවක් ලෙස භාවිතා කිරීම) නමුත් නියත නූලක් භාවිතා කිරීමෙන් නියතයේ අගය මිනිස් කියවිය හැකි අර්ථයක් ඇති බැවින් නිදොස් කිරීම තරමක් පහසු කරයි. .
බැරී වෝක්

17
"Constants.m" සඳහා +1 ඔබේ යෙදුමේ / රාමුවේ ඉලක්කයට එකතු කළ යුතු අතර එමඟින් එය අවසාන නිෂ්පාදනයට සම්බන්ධ වේ. " මගේ සිහිබුද්ධිය ඉතිරි කළා. @amok, Constants.m හි "තොරතුරු ලබා ගන්න" සහ "ඉලක්ක" ටැබය තෝරන්න. අදාළ ඉලක්කය (ය) සඳහා එය පරීක්ෂා කර ඇති බවට වග බලා ගන්න.
PEZ

73
Ar බැරී: කොකෝවා හි, ඒ වෙනුවට ඒවායේ NSStringගුණාංග නිර්වචනය කරන පන්ති ගණනාවක් මම දැක ඇත්තෙමි . එනිසා, ඔවුන් ඔබේ නියතයට වෙනස් අවස්ථාවක් දරයි (සහ කළ යුතුය) , සහ memory ජු මතක ලිපින සංසන්දනය අසාර්ථක වනු ඇත. එසේම, ඕනෑම සාධාරණ ලෙස ප්‍රශස්ත ලෙස ක්‍රියාවට නැංවීම , චරිත සංසන්දනයේ අමිහිරි අමිහිරි තත්ත්වයට පත්වීමට පෙර දර්ශක සමානාත්මතාවය පරීක්ෂා කරනු ඇතැයි මම සිතමි . copyretainNSString*-isEqualToString:
බෙන් මෝෂර්

281

පහසුම ක්‍රමය:

// Prefs.h
#define PREFS_MY_CONSTANT @"prefs_my_constant"

වඩා හොඳ ක්‍රමය:

// Prefs.h
extern NSString * const PREFS_MY_CONSTANT;

// Prefs.m
NSString * const PREFS_MY_CONSTANT = @"prefs_my_constant";

දෙවැන්නෙහි එක් වාසියක් නම් නියතයක අගය වෙනස් කිරීම ඔබේ සමස්ත වැඩසටහනම නැවත ගොඩනැඟීමට හේතු නොවන බවයි.


12
මම හිතුවේ ඔබ නියතයන්ගේ වටිනාකම වෙනස් නොකළ යුතු බවයි.
ruipacheco

71
ඇන්ඩ rew අදහස් කරන්නේ කේතනය කිරීමේදී නියතයේ අගය වෙනස් කිරීම මිස යෙදුම ක්‍රියාත්මක වන අතරතුර නොවේ.
රැන්ඩල්

7
එසේ කිරීමේදී කිසියම් අමතර වටිනාකමක් තිබේද extern NSString const * const MyConstant, එනම් එය නියත දර්ශකයකට වඩා නියත වස්තුවකට නියත දර්ශකයක් බවට පත් කිරීමද?
හරී කරම් සිං

4
කුමක් සිදුවේද, මම මෙම ප්‍රකාශය ශීර්ෂ ගොනුවේ භාවිතා කරන්නේ නම්, ස්ථිතික NSString * const kNSStringConst = const "const value"; .H සහ .m ලිපිගොනු වල වෙන වෙනම ප්‍රකාශ නොකිරීම සහ init අතර වෙනස කුමක්ද?
කරීම්

4
Og ඩොග්වෙදර් - පිළිතුර සම්පාදකයා පමණක් දන්නා තැනක්. IE, යෙදුමක් තැනීම සම්පාදනය කිරීම සඳහා භාවිතා කළ සම්පාදකය පිළිබඳ මෙනුවකට ඇතුළත් කිරීමට ඔබට අවශ්‍ය නම්, සම්පාදනය කළ කේතය වෙනත් ආකාරයකින් දැනගත නොහැකි බැවින් ඔබට එය එහි තැබිය හැකිය. මට තවත් බොහෝ ස්ථාන ගැන සිතිය නොහැක. මැක්‍රෝස් නිසැකවම බොහෝ ස්ථානවල භාවිතා නොකළ යුතුය. මා # MY_CONST 5 සහ වෙනත් තැනක # අර්ථ දැක්වුවහොත් MY_CONST_2 25. ප්‍රති result ලය වන්නේ 5_2 සම්පාදනය කිරීමට උත්සාහ කරන විට ඔබට සම්පාදක දෝෂයක් ඇතිවිය හැකි වීමයි. නියතයන් සඳහා # අර්ථ දැක්වීම භාවිතා නොකරන්න. නියතයන් සඳහා const භාවිතා කරන්න.
ArtOfWarfare

190

සඳහන් කළ යුතු එක් දෙයක් ද තිබේ. ඔබට ගෝලීය නොවන නියතයක් අවශ්‍ය නම්, ඔබ staticයතුරු පද භාවිතා කළ යුතුය .

උදාහරණයක්

// In your *.m file
static NSString * const kNSStringConst = @"const value";

නිසා ඇති staticමූල පදය, මෙම const ගොනුවේ දෘශ්යමාන පිටත නොවේ.


@ ක්වින් ටේලර් විසින් සුළු නිවැරදි කිරීම : සංයුක්ත ඒකකයක් තුළ ස්ථිතික විචල්‍යයන් දැකිය හැකිය . සාමාන්‍යයෙන්, මෙය තනි .m ගොනුවකි (මෙම උදාහරණයේ දී මෙන්), නමුත් ඔබ එය වෙනත් තැනක ඇතුළත් කර ඇති ශීර්ෂ පා in යකින් ප්‍රකාශ කළහොත් එය ඔබට දෂ්ට කළ හැකිය.


41
සුළු නිවැරදි කිරීම: සම්පාදන ඒකකයක් තුළ ස්ථිතික විචල්‍යයන් දැකිය හැකිය . සාමාන්‍යයෙන්, මෙය තනි .m ගොනුවකි (මෙම උදාහරණයේ දී මෙන්), නමුත් ඔබ එය වෙනත් තැනක ඇතුළත් කර ඇති ශීර්ෂයක ප්‍රකාශ කළහොත් එය ඔබට දෂ්ට කළ හැකිය, මන්ද සම්පාදනය කිරීමෙන් පසු ඔබට සම්බන්ධක දෝෂ ලැබෙනු ඇත.
ක්වින් ටේලර්

මම ස්ථිතික මූල පදය භාවිතා නොකරන්නේ නම්, ව්‍යාපෘතිය පුරාම kNSStringConst ලබා ගත හැකිද?
ඩැනියල් අයිට්කින්


1
ශීර්ෂ ගොනුවක ස්ථිතික සම්බන්ධක ගැටළු ලබා නොදේ. කෙසේ වෙතත්, ශීර්ෂ ගොනුව ඇතුළුව සෑම සම්පාදන ඒකකයකටම එහි ස්ථිතික විචල්‍යය ලැබෙනු ඇත, එබැවින් ඔබ 100 .m ගොනු වලින් ශීර්ෂකය ඇතුළත් කළහොත් ඒවායින් 100 ක් ඔබට ලැබේ.
gnasher729

omkompozer .m ගොනුවේ කුමන කොටසෙහි ඔබ මෙය ස්ථානගත කරන්නේද?
බැසිල් බෝර්ක්

117

පිළිගත් (සහ නිවැරදි) පිළිතුර පවසන්නේ "ඔබට මෙම [Constants.h] ගොනුව ... ව්‍යාපෘතිය සඳහා පෙර සම්පාදනය කරන ලද ශීර්ෂයට ඇතුළත් කළ හැකිය."

නවකයකු ලෙස, වැඩිදුර පැහැදිලි කිරීමකින් තොරව මට මෙය කිරීමට අපහසු විය - මෙන්න කෙසේද: YourAppNameHere-Prefix.pch ගොනුවේ (මෙය Xcode හි පෙර සැකසූ ශීර්ෂයේ පෙරනිමි නමයි), ඔබේ Constants.h බ්ලොක් එක තුළ#ifdef __OBJC__ ආනයනය කරන්න .

#ifdef __OBJC__
  #import <UIKit/UIKit.h>
  #import <Foundation/Foundation.h>
  #import "Constants.h"
#endif

Constants.h සහ Constants.m ලිපිගොනු වල පිළිගත් පිළිතුරෙහි විස්තර කර ඇති දේ හැර වෙනත් කිසිවක් අඩංගු නොවන බව සලකන්න. (අතුරු මුහුණතක් හෝ ක්‍රියාත්මක කිරීමක් නොමැත).


මම මෙය කළ නමුත් සමහර ලිපිගොනු සම්පාදනය කිරීමේදී දෝෂයක් ඇති කරයි "ප්‍රකාශයට පත් නොකළ හඳුනාගැනීමේ භාවිතය 'CONSTANTSNAME' මම දෝෂය විසි කරන ගොනුවේ නියත.එච් ඇතුළත් කළහොත් එය ක්‍රියා කරයි, නමුත් එය මට අවශ්‍ය නොවේ. මම පිරිසිදු කර, වසා දැමුවෙමි xcode සහ ගොඩනැගීම සහ තවමත් ගැටළු ... අදහස් තිබේද?
J3RM

50

මම සාමාන්‍යයෙන් භාවිතා කරන්නේ බැරී වෝක් සහ රාහුල් ගුප්තා විසින් පළ කරන ලද ක්‍රමයයි.

.H සහ .m ගොනුවේ එකම වචන පුනරාවර්තනය කිරීමට මා කැමති නැත. සටහන, පහත උදාහරණයේ රේඛාව ලිපිගොනු දෙකෙහිම පාහේ සමාන බව:

// file.h
extern NSString* const MyConst;

//file.m
NSString* const MyConst = @"Lorem ipsum";

එබැවින්, මම කිරීමට කැමති C පෙර සැකසුම් යන්ත්‍ර භාවිතා කිරීමයි. මම උදාහරණයෙන් පැහැදිලි කරන්නම්.

සාර්ව අර්ථ දක්වන ශීර්ෂ ගොනුවක් මා සතුව ඇත STR_CONST(name, value):

// StringConsts.h
#ifdef SYNTHESIZE_CONSTS
# define STR_CONST(name, value) NSString* const name = @ value
#else
# define STR_CONST(name, value) extern NSString* const name
#endif

මගේ .h / .m යුගලයේ නියතය නිර්වචනය කිරීමට අවශ්‍ය තැන මම පහත සඳහන් දේ කරමි:

// myfile.h
#import <StringConsts.h>

STR_CONST(MyConst, "Lorem Ipsum");
STR_CONST(MyOtherConst, "Hello world");

// myfile.m
#define SYNTHESIZE_CONSTS
#import "myfile.h"

et voila, .h ගොනුවේ නියතයන් පිළිබඳ සියලු තොරතුරු මා සතුව ඇත.


හ්ම්, කෙසේ වෙතත් සුළු අවවාදයක් ඇත, ශීර්ෂ ගොනුව පෙර සැකසූ ශීර්ෂයට ආනයනය කරන්නේ නම් ඔබට මේ ක්‍රමය භාවිතා කළ නොහැක, මන්ද එය .h ගොනුව .m ගොනුවට පටවන්නේ නැති නිසා එය දැනටමත් සම්පාදනය කර ඇති බැවිනි. කෙසේ වෙතත් ක්‍රමයක් තිබේ - මගේ පිළිතුර බලන්න (අදහස් දැක්වීමේදී මට හොඳ කේතයක් තැබිය නොහැකි බැවින්
ස්කොට් ලිට්ල්

මට මේක වැඩ කරන්න බැහැ. මම "myfile.h" ආනයනය කිරීමට පෙර # SYNTHESIZE_CONSTS යන්න අර්ථ දැක්වුවහොත් එය .h සහ .m යන දෙකෙහිම NSString * කරයි (සහකාර දර්ශනය සහ පෙර සැකසුම් භාවිතයෙන් පරීක්ෂා කර ඇත). එය නැවත අර්ථ දැක්වීමේ දෝෂ විසි කරයි. මම # ආනයනය "myfile.h" ට පසුව තැබුවහොත් එය ගොනු දෙකෙහිම බාහිර NSString * කරයි. එවිට එය "නිර්වචනය නොකළ සංකේතය" දෝෂ විසි කරයි.
ආර්සෙනියස්

28

එවැනි මනාපයන් සඳහා භාවිතා කරන නියත එන්එස්එස්ට්රිං ප්රකාශ කිරීම සඳහා කැප වූ ශීර්ෂයක් මා සතුව ඇත:

extern NSString * const PPRememberMusicList;
extern NSString * const PPLoadMusicAtListLoad;
extern NSString * const PPAfterPlayingMusic;
extern NSString * const PPGotoStartupAfterPlaying;

ඉන්පසු ඒවා .m ගොනුවේ ප්‍රකාශ කරන්න:

NSString * const PPRememberMusicList = @"Remember Music List";
NSString * const PPLoadMusicAtListLoad = @"Load music when loading list";
NSString * const PPAfterPlayingMusic = @"After playing music";
NSString * const PPGotoStartupAfterPlaying = @"Go to startup pos. after playing";

මෙම ප්රවේශය මට හොඳින් සේවය කර ඇත.

සංස්කරණය කරන්න: බහු ලිපිගොනු වල නූල් භාවිතා කරන්නේ නම් මෙය වඩාත් හොඳින් ක්‍රියාත්මක වන බව සලකන්න. එක් ගොනුවක් පමණක් එය භාවිතා කරන්නේ නම්, ඔබට #define kNSStringConstant @"Constant NSString"නූල් භාවිතා කරන .m ගොනුවේ කළ හැකිය.


25

RizKrizz හි යෝජනාවේ සුළු වෙනස් කිරීමක්, එමඟින් නියත ශීර්ෂ ගොනුව PCH තුළට ඇතුළත් කළ යුතු නම් එය නිසියාකාරව ක්‍රියාත්මක වන අතර එය සාමාන්‍ය දෙයකි. මුල් පිටපත PCH වෙත ආනයනය කර ඇති බැවින්, එය .mගොනුවට නැවත පූරණය නොකරන අතර එමඟින් ඔබට සංකේත කිසිවක් නොලැබෙන අතර සම්බන්ධකය අසතුටට පත්වේ.

කෙසේ වෙතත්, පහත දැක්වෙන වෙනස් කිරීම එය ක්රියා කිරීමට ඉඩ දෙයි. එය ටිකක් කැළඹී ඇත, නමුත් එය ක්රියා කරයි.

ඔබට අවශ්ය 3 ගොනු, .hනිරන්තර අර්ථ දැක්වීම් ඇති ගොනු, එම .hගොනු සහ .m, ගොනු මම භාවිතා කරන්නේ ConstantList.h, Constants.hහා Constants.mපිළිවෙලින්. අන්තර්ගතය Constants.hසරලව:

// Constants.h
#define STR_CONST(name, value) extern NSString* const name
#include "ConstantList.h"

සහ Constants.mගොනු වගේ:

// Constants.m
#ifdef STR_CONST
    #undef STR_CONST
#endif
#define STR_CONST(name, value) NSString* const name = @ value
#include "ConstantList.h"

අවසාන වශයෙන්, ConstantList.hගොනුවේ සත්‍ය ප්‍රකාශයන් ඇති අතර එපමණයි:

// ConstantList.h
STR_CONST(kMyConstant, "Value");

සැලකිල්ලට ගත යුතු කරුණු කිහිපයක්:

  1. මැක්‍රෝ භාවිතා කිරීම සඳහා .mගොනුවේ ඇතුළත් කිරීමෙන් පසුව මට එය නැවත අර්ථ #undefදැක්වීමට සිදු විය.

  2. මම ද භාවිතා කිරීමට සිදු #includeවෙනුවට #importනිසි වැඩ සහ මීට පෙර precompiled වටිනාකම් දුටු සම්පාදකවරයා වළක්වා ගැනීමට මේ සඳහා.

  3. කිසියම් අගයක් වෙනස් වූ විට ඔබේ PCH (සහ බොහෝ විට සමස්ත ව්‍යාපෘතිය) නැවත සකස් කිරීම මේ සඳහා අවශ්‍ය වනු ඇත, ඒවා සාමාන්‍ය පරිදි වෙන් කර (හා අනුපිටපත් කර) තිබේ නම් එය එසේ නොවේ.

යමෙකුට ප්‍රයෝජනවත් වන බලාපොරොත්තුව.


1
# Include භාවිතා කිරීමෙන් මට මෙම හිසරදය නිවැරදි විය.
රැම්සෙල්

පිළිගත් පිළිතුර හා සසඳන විට මෙය කිසියම් කාර්ය සාධනයක් / මතක ශක්තියක් නැතිද?
ගයිෆිස්

පිළිගත් පිළිතුරට සාපේක්ෂව කාර්ය සාධනයට පිළිතුරු වශයෙන්, කිසිවක් නැත. සම්පාදකයාගේ දෘෂ්ටි කෝණයෙන් එය හරියටම එකම දෙයයි. ඔබ අවසන් වන්නේ එකම ප්‍රකාශයන් සමඟ ය. ඔබ externඉහත සඳහන් දේ වෙනුවට ආදේශ කළහොත් ඒවා හරියටම සමාන FOUNDATION_EXPORTවේ.
ස්කොට් ලිට්ල්


12

අබිසර් පැවසූ පරිදි, ඔබට එය PCH ගොනුවට දැමිය හැකිය. එතරම් අපිරිසිදු නොවන තවත් ක්‍රමයක් නම්, ඔබගේ සියලුම යතුරු සඳහා ඇතුළත් කළ ගොනුවක් සාදා ඉන්පසු ඔබ යතුරු භාවිතා කරන ගොනුවට ඇතුළත් කිරීම හෝ එය PCH තුළට ඇතුළත් කිරීම ය. ඔවුන් සතුව ඔවුන්ගේම ගොනුවක් ඇතුළත් වන අතර, අවම වශයෙන් ඔබට මෙම නියතයන් සොයා බැලීමට සහ අර්ථ දැක්වීමට එක් ස්ථානයක්වත් ලබා දේ.


11

ඔබට ගෝලීය නියතයන් වැනි දෙයක් අවශ්‍ය නම්; ඉක්මන් අපිරිසිදු ක්‍රමයක් නම් නිරන්තර ප්‍රකාශන pchගොනුවට දැමීමයි.


7
.Pch සංස්කරණය කිරීම සාමාන්‍යයෙන් හොඳම අදහස නොවේ. සෑම විටම පාහේ .m ගොනුවක් වන විචල්‍යය නිර්වචනය කිරීමට ඔබට ස්ථානයක් සොයා ගැනීමට සිදුවේ , එබැවින් එය ගැලපෙන .h ගොනුවේ ප්‍රකාශයට පත් කිරීම වඩාත් අර්ථවත් කරයි . Constants.h / m යුගලයක් නිර්මාණය කිරීම සඳහා පිළිගත් පිළිතුර ඔබට මුළු ව්‍යාපෘතිය පුරාම අවශ්‍ය නම් හොඳ එකකි. මම සාමාන්‍යයෙන් නියතයන් හැකි තාක් දුරට ධූරාවලියට පහළින් තබමි.
ක්වින් ටේලර්

8

පන්ති ක්‍රමයක් භාවිතා කිරීමට උත්සාහ කරන්න:

+(NSString*)theMainTitle
{
    return @"Hello World";
}

මම සමහර විට එය භාවිතා කරමි.


6
පන්ති ක්‍රමයක් නියත නොවේ. එය ක්‍රියාත්මක වන වේලාවට පිරිවැයක් ඇති අතර සෑම විටම එකම වස්තුවක් ආපසු ලබා නොදීමට ඉඩ ඇත (එය ඔබ එය එසේ ක්‍රියාත්මක කරන්නේ නම්, නමුත් ඔබ එය අනිවාර්යයෙන්ම ඒ ආකාරයෙන් ක්‍රියාත්මක කර නැත), එයින් අදහස් වන්නේ ඔබ isEqualToString:සැසඳීම සඳහා භාවිතා කළ යුතු බවයි, එනම් ධාවන වේලාවේ තවත් පිරිවැයක්. ඔබට නියතයන් අවශ්‍ය විට නියතයන් සාදන්න.
පීටර් හෝසි

2
Et පීටර් හෝසි, ඔබේ අදහස් නිවැරදි වුවත්, අපි ඒ කාර්ය සාධනය LOC එකකට වරක් හෝ ඊට වැඩි ගණනක් රූබි වැනි “ඉහළ මට්ටමේ” භාෂාවලින් ලබා ගනිමු. මම කියන්නේ නැහැ ඔබ නිවැරදි නැහැ, නමුත් විවිධ "ලෝක" වල ප්‍රමිතීන් වෙනස් වන්නේ කෙසේද යන්න ගැන අදහස් දැක්වීම.
ඩෑන් රොසෙන්ස්ටාර්ක්

1
රූබි පිළිබඳ ඇත්ත. සාමාන්‍ය යෙදුම සඳහා පුද්ගලයින් කේත කරන බොහෝ කාර්ය සාධනය අනවශ්‍යය.
පීටර් ඩිවීස්

8

ඔබ නාම අවකාශ නියතයට කැමති නම්, ඔබට ව්‍යුහය උත්තේජනය කළ හැකිය, සිකුරාදා ප්‍රශ්නෝත්තර 2011-08-19: නාම අවකාශ නියතයන් සහ කාර්යයන්

// in the header
extern const struct MANotifyingArrayNotificationsStruct
{
    NSString *didAddObject;
    NSString *didChangeObject;
    NSString *didRemoveObject;
} MANotifyingArrayNotifications;

// in the implementation
const struct MANotifyingArrayNotificationsStruct MANotifyingArrayNotifications = {
    .didAddObject = @"didAddObject",
    .didChangeObject = @"didChangeObject",
    .didRemoveObject = @"didRemoveObject"
};

1
නියම දෙයක්! නමුත් ARC යටතේ ව්‍යුහාත්මක ප්‍රකාශනයේ සියලුම විචල්‍යයන් __unsafe_unretainedසුදුසුකම් සහිතව උපසර්ගගත කළ යුතුය.
සිමෙන්

7

මම සිංගල්ටන් පංතියක් භාවිතා කරමි, එවිට මට පන්තියට සරදම් කිරීමට සහ පරීක්ෂා කිරීම සඳහා අවශ්‍ය නම් නියතයන් වෙනස් කිරීමට හැකිය. නියත පන්තිය මේ වගේ ය:

#import <Foundation/Foundation.h>

@interface iCode_Framework : NSObject

@property (readonly, nonatomic) unsigned int iBufCapacity;
@property (readonly, nonatomic) unsigned int iPort;
@property (readonly, nonatomic) NSString * urlStr;

@end

#import "iCode_Framework.h"

static iCode_Framework * instance;

@implementation iCode_Framework

@dynamic iBufCapacity;
@dynamic iPort;
@dynamic urlStr;

- (unsigned int)iBufCapacity
{
    return 1024u;
};

- (unsigned int)iPort
{
    return 1978u;
};

- (NSString *)urlStr
{
    return @"localhost";
};

+ (void)initialize
{
    if (!instance) {
        instance = [[super allocWithZone:NULL] init];
    }
}

+ (id)allocWithZone:(NSZone * const)notUsed
{
    return instance;
}

@end

එය මේ ආකාරයට භාවිතා කරයි (නියතයන් සඳහා කෙටිමං භාවිතා කිරීම c - එය [[Constants alloc] init]සෑම විටම ටයිප් කිරීම ඉතිරි කරයි ):

#import "iCode_FrameworkTests.h"
#import "iCode_Framework.h"

static iCode_Framework * c; // Shorthand

@implementation iCode_FrameworkTests

+ (void)initialize
{
    c  = [[iCode_Framework alloc] init]; // Used like normal class; easy to mock!
}

- (void)testSingleton
{
    STAssertNotNil(c, nil);
    STAssertEqualObjects(c, [iCode_Framework alloc], nil);
    STAssertEquals(c.iBufCapacity, 1024u, nil);
}

@end

1

ඔබට NSString.newLine;වෛෂයික c වෙතින් මෙවැනි දෙයක් ඇමතීමට අවශ්‍ය නම් සහ එය ස්ථිතික නියතයක් වීමට ඔබට අවශ්‍ය නම්, ඔබට මේ වගේ දෙයක් වේගයෙන් නිර්මාණය කළ හැකිය:

public extension NSString {
    @objc public static let newLine = "\n"
}

ඔබට කියවිය හැකි නියත අර්ථ දැක්වීමක් ඇති අතර, ඔබේ අභිමතය පරිදි ලබා ගත හැකිය.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.