iOS 謂詞(NSPredicate)

謂詞: 簡(jiǎn)單的說(shuō)就是一個(gè)過(guò)濾器, 符合條件的留下, 不符合條件的刪除

一. NSPredicate的基本語(yǔ)法

只要使用謂詞(NSPredicate)都需要為謂詞定義謂詞表達(dá)式, 而這個(gè)表達(dá)式必須是一個(gè)返回BOOL的值
謂詞表達(dá)式由表達(dá)式, 運(yùn)算符和值構(gòu)成

1: 比較運(yùn)算符

(1)=男翰、==:判斷兩個(gè)表達(dá)式是否相同
備注: 在謂詞中=和==是都是相同的意思, 不是賦值

(2)>=, =>: 判斷左邊的表達(dá)式的值是否 大于或等于 右邊表達(dá)式的值

(3)<=, =<: 判斷左邊的表達(dá)式的值是否 小于或等于 右邊表達(dá)式的值

(4)>: 判斷左邊表達(dá)式的值是否 大于 右邊表達(dá)式的值

(5)<: 判斷左邊表達(dá)式的值是否 小于 右邊表達(dá)式的值

(6)!=, <>: 判斷兩個(gè)表達(dá)式是否 不相等

(7)BETWEEN: 該表達(dá)式必須滿(mǎn)足: 表達(dá)式 BETWEEN {下限,上限} 的格式, 要求該表達(dá)式必須 大于或等于下限, 并小于等于上限

例: 
NSNumber *testNumber = @16;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF BETWEEN {12,19}"];
if ([predicate evaluateWithObject:testNumber]) {
     NSLog(@"testNumber = %@", testNumber);
}
else {
     NSLog(@"不符合");
}

2: 邏輯運(yùn)算符:

(1)AND, &&: 邏輯與, 要求兩個(gè)表達(dá)式的值都為YES時(shí), 結(jié)果才為YES

例: NSArray *testArray = @[@1, @2, @3, @4, @5, @6];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF > 2 && SELF < 5"];
    NSArray *filterArray = [testArray filteredArrayUsingPredicate:predicate];
    NSLog(@"filterArray: %@",filterArray);

輸出結(jié)果:filterArray: (
    3,
    4
)

(2)OR, ||: 邏輯或, 要求其中一個(gè)表達(dá)式為YES時(shí), 結(jié)果就是YES

例: NSArray *testArray = @[@1, @2, @3, @4, @5, @6];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF < 2 || SELF > 5"];
    NSArray *filterArray = [testArray filteredArrayUsingPredicate:predicate];
    NSLog(@"filterArray: %@",filterArray);

輸出結(jié)果:filterArray: (
    1,
    6
)

(3)NOT, !: 邏輯非, 對(duì)原有的表達(dá)式取反

例: NSNumber *testNumber = @1;
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF != 1"];
    if ([predicate evaluateWithObject:testNumber]) {
        NSLog(@"testNumber = %@", testNumber);
    }
    else {
        NSLog(@"不符合條件");
    }

輸出結(jié)果: 不符合條件

3: 字符串比較運(yùn)算符:

(1)BEGINSWITH: 檢查某個(gè)字符串是否已指定的字符串開(kāi)頭

例: NSString *testString = @"testString";
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF BEGINSWITH 't'"];
    if ([predicate evaluateWithObject:testString]) {
        NSLog(@"testString = %@", testString);
    }
    else {
        NSLog(@"不符合條件");
    }
輸出結(jié)果: testString = testString

(2)ENDSWITH:檢查某個(gè)字符串是否以指定的字符串結(jié)尾

(3)CONTAINS: 檢查某個(gè)字符串是否包含指定的字符串

例: NSString *testString = @"testString";
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS 'ts'"];
    if ([predicate evaluateWithObject:testString]) {
        NSLog(@"testString = %@", testString);
    }
    else {
        NSLog(@"不符合條件");
    }

輸出結(jié)果: 不符合條件
備注: ts要用單引號(hào)' ' 括住, 否則會(huì)崩潰, 切記;

(4) LIKE: 檢查某個(gè)字符串是否匹配指定的字符串模板. 其之后可以跟 ? 代表一個(gè)字符 和 * 代表任意多個(gè)字符 兩個(gè)通配符;
例: "testString LIKE '*tS*'": 表示如果testString的值中包含ac則返回YES, 此時(shí)和CONTAINS相同

NSString *testString = @"testString";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF LIKE '*tS*'"];
if ([predicate evaluateWithObject:testString]) {
     NSLog(@"testString = %@", testString);
 }
 else {
     NSLog(@"不符合條件");
 }

輸出結(jié)果:testString = testString

例: "testString LIKE '?tS*", 表示testString的第2, 3個(gè)字符為ac時(shí), 返回YES

NSString *testString = @"testString";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF LIKE '?tS*'"];
if ([predicate evaluateWithObject:testString]) {
    NSLog(@"testString = %@", testString);
}
else {
    NSLog(@"不符合條件");
}

輸出結(jié)果: 不符合條件

(5)MATCHES: 檢查某個(gè)字符串是否匹配指定的正則表達(dá)式。雖然正則表達(dá)式的執(zhí)行效率是最低的, 但其功能是最強(qiáng)大的, 也是我們 最常用 的。

注: 字符串比較都是區(qū)分 大小寫(xiě) 和重音符號(hào) 的蜻拨。如:café和cafe是不一樣的,Cafe和cafe也是不一樣的。如果希望字符串比較運(yùn)算不區(qū)分大小寫(xiě)和重音符號(hào)溅话, 請(qǐng)?jiān)谶@些運(yùn)算符后使用 [c], [d]選項(xiàng)。其中[c] 是不區(qū)分大小寫(xiě)歌焦,[d]是不區(qū)分重音符號(hào)飞几,其寫(xiě)在字符串比較運(yùn)算符之后,比如: testString LIKE[cd] 'cafe', 那么不論testString是cafe独撇,Cafe還是café上面的表達(dá)式都會(huì)返回YES屑墨。

4. 集合運(yùn)算符

(1)ANY、SOME: 集合中任意一個(gè)元素滿(mǎn)足條件纷铣,就返回YES绪钥。

NSArray *testArray = @[@"zhao",@"qian",@"sun"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY SELF BEGINSWITH 'su'"];
if ([predicate evaluateWithObject:testArray]) {
    NSLog(@"testArray = %@", testArray);
}
else {
    NSLog(@"不符合條件");
}

輸出結(jié)果:testArray = (
    zhao,
    qian,
    sun
)

(2)ALL: 集合中所有元素都滿(mǎn)足條件,才返回YES

NSArray *testArray = @[@"zhao",@"qian",@"sun"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ALL SELF BEGINSWITH 'su'"];
if ([predicate evaluateWithObject:testArray]) {
    NSLog(@"testArray = %@", testArray);
}
else {
    NSLog(@"不符合條件");
}

輸出結(jié)果: 不符合條件

(3)NONE: 集合中沒(méi)有任何元素滿(mǎn)足條件就返回YES

NSArray *testArray = @[@4, @5, @6, @7];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NONE SELF < 3"];
if ([predicate evaluateWithObject:testArray]) {
    NSLog(@"testArray = %@", testArray);
}
else {
    NSLog(@"不符合條件");
}

輸出結(jié)果:testArray = (
    4,
    5,
    6,
    7
)

(4)IN: 等價(jià)于SQL語(yǔ)句中的IN運(yùn)算符关炼, 只有當(dāng)左邊表達(dá)式或值出現(xiàn)在右邊的集合中才會(huì)返回YES

NSArray *filterArray = @[@"ab", @"abc"];
NSArray *testArray = @[@"a", @"ab", @"abc", @"abcd"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (SELF IN %@)", filterArray];
NSLog(@"%@",[testArray filteredArrayUsingPredicate:predicate]);
    
輸出結(jié)果:(
    a,
    abcd
)

上面那段代碼的作用是將testArray中和filterArray中相同的元素去除

5.直接量

在謂詞表達(dá)式中可以使用如下直接量:
(1)FALSE程腹、NO:代表邏輯假
(2)TRUE、YES:代表邏輯真
(3)NULL儒拂、NIL:代表空值
(4)SELF:代表正在被判斷的對(duì)象自身
(5)"string"或'string':代表字符串
(6)數(shù)組:和c中的寫(xiě)法相同寸潦, 如:{'one','two','three'}
(7)數(shù)值: 包括證書(shū)、小數(shù)和科學(xué)計(jì)數(shù)法表示的形式
(8)十六進(jìn)制數(shù): 0x開(kāi)頭的數(shù)字
(9)八進(jìn)制: 0o開(kāi)頭的數(shù)字
(10)二進(jìn)制:0b開(kāi)頭的數(shù)字

6.保留字

下列單詞都是保留字(不論大小寫(xiě))
AND社痛、OR见转、IN、NOT蒜哀、ALL斩箫、ANY、SOME撵儿、NONE乘客、LIKE、CASEINSENSITIVE淀歇、CI易核、MATCHES、CONTAINS浪默、BEGINSWITH牡直、ENDSWITH缀匕、BETWEEN、NULL碰逸、NIL乡小、SELF、TRUE饵史、YES、FALSE约急、NO零远、FIRST、LAST厌蔽、SIZE牵辣、ANYKEY、SUBQUERY奴饮、CAST纬向、TRUEPREDICATE、FALSEPREDICATE

注:雖然大小寫(xiě)都可以戴卜,但是更推薦使用大寫(xiě)來(lái)表示這些保留字

二逾条、謂詞的用法

1.定義謂詞

NSPredicate *predicate = [NSPredicate predicateWithFormat:@""];

例一:
定義模型:
ZLPersonModel.h

#import <Foundation/Foundation.h>

typedef NS_ENUM(NSInteger, ZLPersonSex){
    ZLPersonSexMale = 0,
    ZLPersonSexFemale
};

@interface ZLPersonModel : NSObject

/** 姓名 */
@property (nonatomic, copy) NSString *name;
/** 年齡 */
@property (nonatomic, assign, readonly) NSUInteger age;
/** 性別 */
@property (nonatomic, assign, readonly) ZLPersonSex sex;

+ (instancetype)personWithName:(NSString *)name age:(NSUInteger)age sex:(ZLPersonSex)sex;
 
@end

ZLPersonModel.m

#import "ZLPersonModel.h"

@implementation ZLPersonModel

- (instancetype)initWithName:(NSString *)name age:(NSUInteger)age sex:(ZLPersonSex)sex {
    self = [super init];
    if (self) {
        _name = name;
        _age = age;
        _sex = sex;
    }
    return self;
}

+ (instancetype)personWithName:(NSString *)name age:(NSUInteger)age sex:(ZLPersonSex)sex {
    return [[self alloc] initWithName:name age:age sex:sex];
}

@end

開(kāi)始使用:

ZLPersonModel *sunnyzl = [ZLPersonModel personWithName:@"sunnyzl" age:29 sex:ZLPersonSexMale];
ZLPersonModel *jack = [ZLPersonModel personWithName:@"jack" age:22 sex:ZLPersonSexMale];
  
//1: 判斷姓名是否是以s開(kāi)頭
NSPredicate *pred1 = [NSPredicate predicateWithFormat:@"name LIKE 's*'"];
//輸出結(jié)果: sunnyzl: 1, jack: 0
NSLog(@"sunnyzl: %d, jack: %d",[pred1 evaluateWithObject:sunnyzl], [pred1 evaluateWithObject:jack]);
   
//2: 判斷年齡是否大于25
NSPredicate *pred2 = [NSPredicate predicateWithFormat:@"age > 25"];
//輸出結(jié)果: sunnyzl的年齡是否大于25: 1, jack的年齡是否大于25: 0
NSLog(@"sunnyzl的年齡是否大于25: %d, jack的年齡是否大于25: %d",[pred2 evaluateWithObject:sunnyzl], [pred2 evaluateWithObject:jack]);

2.使用謂詞過(guò)濾集合(很重要)

其實(shí) 謂詞 本身就代表了一個(gè)邏輯條件,計(jì)算謂詞之后返回的結(jié)果永遠(yuǎn)為BOOL類(lèi)型的值投剥。而謂詞最常用的功能就是對(duì)集合進(jìn)行過(guò)濾师脂。當(dāng)程序使用謂詞對(duì)集合元素進(jìn)行過(guò)濾時(shí),程序會(huì)自動(dòng)遍歷其元素江锨,并根據(jù)集合元素來(lái)計(jì)算謂詞的值吃警,當(dāng)這個(gè)集合中的元素計(jì)算謂詞并返回YES時(shí),這個(gè)元素才會(huì)被保留下來(lái)啄育。請(qǐng)注意 程序會(huì)自動(dòng)遍歷其元素酌心,它會(huì)將自動(dòng)遍歷過(guò)之后返回為YES的值重新組合成一個(gè)集合返回。

//NSArray提供了如下方法使用謂詞來(lái)過(guò)濾集合
//根據(jù)指定的謂詞過(guò)濾集合挑豌,并將符合條件的元素組成新的集合返回(應(yīng)用于NSArray中)
//參數(shù): 指定的謂詞
//返回:符合謂詞條件的元素組成的集合
- (NSArray<ObjectType> *)filteredArrayUsingPredicate:(NSPredicate *)predicate;   

//NSMutableArray提供了如下方法使用謂詞來(lái)過(guò)濾集合
//根據(jù)指定的謂詞過(guò)濾集合安券,剔除集合中不符合條件的元素
//參數(shù): 指定的謂詞
- (void)filterUsingPredicate:(NSPredicate *)predicate;    

//NSSet提供了如下方法使用謂詞來(lái)過(guò)濾集合
//作用同NSArray中的方法
- (NSSet<ObjectType> *)filteredSetUsingPredicate:(NSPredicate *)predicate;    

//NSMutableSet提供了如下方法使用謂詞來(lái)過(guò)濾集合
//作用同NSMutableArray中的方法
- (void)filterUsingPredicate:(NSPredicate *)predicate API_AVAILABLE(macos(10.5), ios(3.0), watchos(2.0), tvos(9.0));   

備注: 通過(guò)上面的描述可以看出, 使用謂詞過(guò)濾不可變集合和可變集合的區(qū)別是: 過(guò)濾不可變集合時(shí), 會(huì)   返回符合條件  的集合元素組成的新集合; 過(guò)濾可變集合時(shí), 沒(méi)有返回值, 會(huì)   直接剔除不符合條件   的集合元素.

例一:

NSMutableArray *arrayM = [@[@20, @40, @50, @30, @60, @70] mutableCopy];
//過(guò)濾大于50的值
NSPredicate *pred1 = [NSPredicate predicateWithFormat:@"SELF > 50"];
[arrayM filterUsingPredicate:pred1];
NSLog(@"arrayM = %@",arrayM);
    
NSArray *array = @[[ZLPersonModel personWithName:@"Jack" age:20 sex:ZLPersonSexMale],
                   [ZLPersonModel personWithName:@"Rose" age:22 sex:ZLPersonSexFemale],
                   [ZLPersonModel personWithName:@"Jackson" age:30 sex:ZLPersonSexMale],
                   [ZLPersonModel personWithName:@"Johnson" age:35 sex:ZLPersonSexMale]];
//取出名字中包含'son'的元素
NSPredicate *pred2 = [NSPredicate predicateWithFormat:@"name CONTAINS 'son'"];
NSArray *newArray = [array filteredArrayUsingPredicate:pred2];
NSLog(@"newArray = %@",newArray);

輸出結(jié)果:arrayM = (
    60,
    70
)

newArray = (
   "[name = Jackson, age = 30, sex = ZLPersonSexMale]",
   "[name = Johnson, age = 35, sex = ZLPersonSexMale]"
)

3. 在謂詞中使用占位符參數(shù)

我們上面所有的例子中 謂詞 總是 固定的, 然而我們?cè)诂F(xiàn)實(shí)中處理變量時(shí)決定了謂詞應(yīng)該是 可變的. 下面我們來(lái)看看如何讓謂詞變化起來(lái):
首先: 如果我們想在謂詞表達(dá)式中使用變量,那么我們需要了解下列兩種占位符:
%K: 用于動(dòng)態(tài)傳入屬性名
%@: 用于動(dòng)態(tài)設(shè)置屬性值
除此之外, 還可以在謂詞表達(dá)式中使用動(dòng)態(tài)改變的屬性值, 就像環(huán)境變量一樣:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF CONTAINS $VALUE"];

上面表達(dá)式中, $VALUE是一個(gè)可以動(dòng)態(tài)變化的值, 它最后其實(shí)是在字典中的一個(gè)key值, 所以可以根據(jù)你的需要寫(xiě)入不同的值, 但是必須有, 然后隨著程序改變$VALUE這個(gè) 謂詞 表達(dá)式的比較條件就可以動(dòng)態(tài)改變.
例一:

NSArray *array = @[[ZLPersonModel personWithName:@"Jack" age:20 sex:ZLPersonSexMale],
                       [ZLPersonModel personWithName:@"Rose" age:22 sex:ZLPersonSexFemale],
                       [ZLPersonModel personWithName:@"Jackson" age:30 sex:ZLPersonSexMale],
                       [ZLPersonModel personWithName:@"Johnson" age:35 sex:ZLPersonSexMale]];
//定義一個(gè)property來(lái)存放屬性名, 定義一個(gè)value來(lái)存放值
NSString *property = @"name";
NSString *value = @"Jack";
//該謂詞的作用是如果property屬性含有值value時(shí)就取出放入新的數(shù)組內(nèi), 這里是name包含Jack
NSPredicate *pred = [NSPredicate predicateWithFormat:@"%K CONTAINS %@", property, value];
NSArray *newArray = [array filteredArrayUsingPredicate:pred];
NSLog(@"newArray = %@",newArray);

//創(chuàng)建謂詞, 屬性名改為age, 要求這個(gè)age包含$VALUE字符串
NSPredicate *predTemp = [NSPredicate predicateWithFormat:@"%K > $VALUE", @"age"];
//指定$VALUE的值為25
NSPredicate *pred1 = [predTemp predicateWithSubstitutionVariables:@{@"VALUE":@25}];
NSArray *newArray1 = [array filteredArrayUsingPredicate:pred1];
NSLog(@"newArray1 = %@",newArray1);

//修改 $VALUE的值為32
NSPredicate *pred2 = [predTemp predicateWithSubstitutionVariables:@{@"VALUE":@32}];
NSArray *newArray2 = [array filteredArrayUsingPredicate:pred2];
NSLog(@"newArray2 = %@",newArray2);


備注: 
//用常數(shù)值代替變量
//參數(shù): 替換變量的字典
//返回: 替換變量后的謂詞表達(dá)式
- (instancetype)predicateWithSubstitutionVariables:(NSDictionary<NSString *, id> *)variables;   

輸出結(jié)果為:

newArray = (
         "[name = Jack, age = 20, sex = ZLPersonSexMale]",
         "[name = Jackson age = 30, sex = ZLPersonSexMale]"
     )

newArray1 = (
     "[name = Jackson, age = 30, sex = ZLPersonSexMale]",
     "[name = Johnson, age = 35, sex = ZLPersonSexMale]"
     )

newArray2 = (
     "[name = Johnson, age = 35, sex = ZLPersonSexMale]"
     )

原文:http://www.reibang.com/p/88be28860cde

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市氓英,隨后出現(xiàn)的幾起案子侯勉,更是在濱河造成了極大的恐慌,老刑警劉巖债蓝,帶你破解...
    沈念sama閱讀 211,423評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件壳鹤,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡饰迹,警方通過(guò)查閱死者的電腦和手機(jī)芳誓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)啊鸭,“玉大人锹淌,你說(shuō)我怎么就攤上這事≡疲” “怎么了赂摆?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,019評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)钟些。 經(jīng)常有香客問(wèn)我烟号,道長(zhǎng),這世上最難降的妖魔是什么政恍? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,443評(píng)論 1 283
  • 正文 為了忘掉前任汪拥,我火速辦了婚禮,結(jié)果婚禮上篙耗,老公的妹妹穿的比我還像新娘迫筑。我一直安慰自己,他們只是感情好宗弯,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,535評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布脯燃。 她就那樣靜靜地躺著,像睡著了一般蒙保。 火紅的嫁衣襯著肌膚如雪辕棚。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,798評(píng)論 1 290
  • 那天邓厕,我揣著相機(jī)與錄音逝嚎,去河邊找鬼。 笑死邑狸,一個(gè)胖子當(dāng)著我的面吹牛懈糯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播单雾,決...
    沈念sama閱讀 38,941評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼赚哗,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了硅堆?” 一聲冷哼從身側(cè)響起屿储,我...
    開(kāi)封第一講書(shū)人閱讀 37,704評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎渐逃,沒(méi)想到半個(gè)月后够掠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,152評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡茄菊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,494評(píng)論 2 327
  • 正文 我和宋清朗相戀三年疯潭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赊堪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,629評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡竖哩,死狀恐怖哭廉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情相叁,我是刑警寧澤遵绰,帶...
    沈念sama閱讀 34,295評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站增淹,受9級(jí)特大地震影響椿访,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜虑润,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,901評(píng)論 3 313
  • 文/蒙蒙 一成玫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧端辱,春花似錦梁剔、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至渗柿,卻和暖如春个盆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背朵栖。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,978評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工颊亮, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人陨溅。 一個(gè)月前我還...
    沈念sama閱讀 46,333評(píng)論 2 360
  • 正文 我出身青樓终惑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親门扇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子雹有,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,499評(píng)論 2 348