Swift常用术语表(2021年)


Swift中有如此多的语法和功能术语,有时候容易感到困惑。因此,此文章将充当术语的一站式词典,为Swift语言中使用的所有常见术语提供定义。

@

  • @autoclosure:作为闭包的函数参数附加的属性,它要求Swift将在闭包中使用它的任何代码静默包装起来,而不是要求用户手工完成。这很少使用,但是在assert()函数中很重要。
  • @available:附加到类型或函数的属性,将其标记为对特定版本的Swift或操作系统可用或不可用。
  • @discardableResult:附加到返回值的方法的属性,如果调用者愿意,则将返回值标记为可以安全忽略。如果不使用此选项,则如果不对函数的返回值进行任何操作,Swift将显示警告。
  • @dynamicCallable:附加到类型上的属性,用于将其标记为可直接调用,主要是使Swift可以更轻松地与动态语言(例如Python)进行交互。
  • @dynamicMemberLookup:附加到类型的属性,用于将类型标记为能够使用特殊方法处理未定义的属性,主要是使Swift可以更轻松地与动态语言(例如Python)进行交互。
  • @escaping:附加到作为闭包的函数参数的属性,它告诉Swift闭包将在函数返回后使用。反过来,这将导致Swift安全地存储闭包,以免过早销毁它。
  • @objc:用于标记必须由Objective-C代码访问的方法和属性的属性。默认情况下,Swift不会将其代码提供给Objective-C访问,以免使代码变得比需要的大。
  • @objcMembers:用于标记类的属性,其中所有属性和方法都必须可由Objective-C代码访问。默认情况下,Swift不会将其代码提供给Objective-C访问,以免使代码变得比需要的大。
  • @unknown:附加在开关块默认情况下的属性,该属性使代码可以处理将来可能在某个时候添加的枚举情况,而不会破坏源兼容性。

a

  • Access control:一组关键字,用于控制其他代码如何访问属性。 open表示可以从任何地方访问和覆盖该属性,public表示可以从任何地方访问该属性,但是只能在它来自的模块中覆盖; internal表示可以从同一模块内部的任何位置访问该属性,fileprivate意味着该属性可以可以从同一文件内的任何位置访问该属性,而private意味着可以从同一类型内的任何位置访问该属性。
  • ABI:关于Swift编译器如何生成二进制文件的描述:如何在内存中布置和访问数据结构,如何调用函数,等等。
  • API:库为解决特定问题而公开的类,结构,方法和属性的集合。应用程序编程接口的缩写。
  • Argument:传递给函数的值的名称,将在函数内部使用。例如,在sayHello(to:“ Paul”)中,to部分是一个参数。许多人只是说“参数”而不是“论点”,但是论点在技术上是正确的。
  • Array:任何类型的值的顺序集合,例如带中名称的数组。
  • Associated type(关联类型):协议中缺少的类型,必须由符合协议的任何类型来指定。关联类型使我们在添加一致性时具有灵活性:可以说要遵守我们的协议,您必须具有一组项目,但是我们不在乎这些项目的数据类型是什么。关联类型在Swift中是一个单词:associatedtype。
  • Associated value(关联值):已添加到枚举用例中以提供一些额外含义的值。例如,您可能有一个枚举案例,说天气多风,然后添加一个关联值,说天气多风。

b

  • Block:可以表示任何以{开头并以}结尾的代码块(“代码块”),但是“块”也是闭包的Objective-C名称。
  • Boolean:一种存储true或false的数据类型。
  • Brace(括号):用于打开和关闭大括号{和}的名称。
  • Bracket(括号):用于打开和关闭方括号的名称,[和]
  • Break(中断):退出当前循环的关键字。如果与带标签的语句一起使用,例如break myLoop,它将跳出指定的块。

c

  • Capturing values(捕获值):闭包过程的名称,保留对在闭包内部使用但在外部创建的值的引用。这与复制不同:闭包引用原始值,而不是其自己的副本,因此,如果原始值更改,则闭包的值也更改。
  • CaseIterable:可应用于枚举的Swift协议。如果枚举的个案没有关联值,则编译器将生成allCases数组,使您可以遍历枚举中的个案。
  • Catch(捕获):一个关键字,用于启动代码块来处理错误。您可以指定应捕获的错误类型,并使用通用的“全部捕获”块来捕获所有其他错误。与之配对。
  • CGFloat:一个浮点数,根据平台的不同,它可能等效于Double或Float。
  • Class:一种自定义数据类型,可以具有一个或多个属性以及一个或多个方法。与结构不同,类是引用类型。
  • Class inheritance(类继承):一种类可以在另一类上构建,并继承其所有方法和属性的能力。有些语言允许一个类从多个父级继承,但是Swift不允许。
  • Closure:匿名函数,该函数自动保留对其使用的,在函数外部声明的任何值的引用。
  • Codable:一种协议,它允许在结构或类与JSON或XML之间轻松转换。
  • Collection:一种序列类型使用的Swift协议,您可以遍历多次而不会破坏它们或影响集合,例如数组和字典。
  • Comparable(可比性):一种通用的Swift协议,其中规定可以使用<将排序类型放入订单中。
  • Compiler directive(编译器指令):使用#编写的几段特殊代码之一,用作对编译器的指令。例如,编译器指令可以检查我们是否以模拟器为目标,并编译两个代码变体之一。
  • Compound assignment operator(复合赋值运算符):修改值并将其同时赋值回原始变量的运算符。例如,score + = 1将1加到当前值。
  • Computed property(计算属性):任何没有简单存储区值的属性,而是每次通过运行某些代码访问该属性时计算的属性。
  • Condition:使用if语句评估为true或false的所有检查。您可以提供在条件为真时运行的代码,以及其他
  • Conditional conformance(条件一致性):仅在满足特定条件的情况下,才能说类型符合协议的能力。例如,Swift的数组仅在其元素也符合Equatable时才符合Equatable。
  • Constant:程序中的任何命名数据都可能在程序运行时保持不变。
  • Continue:退出循环的当前迭代的关键字,使循环立即开始其下一个迭代。如果与带标签的语句一起使用,例如继续myLoop,它将继续指定的块。
  • Controller:程序中处理逻辑的一部分。模型视图控制器结构的一部分。

d

  • Data:一种类型,可保存任何类型的二进制数据。
  • Default case:与所有其他值匹配的开关块的特殊情况。
  • Default parameter:附加有默认值的功能参数,以允许调用者不提供默认值并获得合理的行为。例如,func checkSettings(debugMode:Bool = true)可以称为checkSettings(debugMode:true)或checkSettings(debugMode:false),也可以称为checkSettings()-缺少debugMode值将假定为true,因为这是默认值。
  • Defer(延迟):一个关键字,允许我们安排退出当前范围的工作。
  • Deinitializer:初始化类的实例被销毁时调用的一种特殊方法。这些可能不接受参数,并且在结构上不存在。
  • Dictionary:使用键存储的高性能,无序值集合,用于快速访问。
  • Do:一个关键字,它启动可能引发错误的代码块。与渔获配对。
  • Double:高精度浮点数,例如3.1或3.141592654。

e

  • Enum:一组命名值,不仅使用字符串或整数,更容易记住和安全。例如,您可以使用北,南,东和西创建方向的枚举-例如,这比使用0、1、2和3更好。 “枚举”的缩写。发音为“ ee-numb”,但“ ee-noom”是可接受的变体。
  • Equatable:一种通用的Swift协议,其中指出可以使用==比较一致性类型是否相等。
  • Error:我们自己的枚举可以遵循的Swift协议,然后我们可以使用该协议引发函数错误。
  • Expression(表达式):一些评估为值的代码。例如,12 * 12的值为144。
  • Extension(扩展):添加到具体类型(例如Int)的一组其他方法和计算属性。

f

  • Fallthrough:在切换块中使用的关键字,意思是“紧随此之后继续执行案例”。
  • Failable initializer(失败的初始值设定项):返回初始值的初始值设定项,因为初始化可能由于某种原因而失败。这些被写为init?()或init!()。
  • Final class(最终类):不能被其他任何东西继承的类。
  • Float:低精度浮点数,例如3.1或3.141592654。
  • For loop :循环计算序列中所有值(例如数组或范围)的循环。
  • Force unwrap(强制解包):首先在可选字段中使用值而不检查其存在的过程。如果可选参数为空(如果没有值),则强制展开将使您的代码崩溃。
  • Framework:您正在使用的代码集合。框架与库的不同之处在于,框架通常接管其操作的控制权,并在需要信息时回调给您。
  • Function:执行特定的可重用任务的代码的命名部分。您可以将参数传递给该函数以自定义其运行方式,并且该函数可能返回一个或多个作为其工作结果的值。
  • Functional programming(函数式编程):一种编程方法,它倾向于与函数之间收发不变的数据,避免产生副作用,并将函数组合在一起。

g

  • Generics(泛型):一种类型或功能可与多种数据类型一起使用的能力。 例如,Swift的数组是通用的,因为您可以创建一个存储整数的数组,一个存储字符串的数组,等等。
  • guard(保护):一种Swift语法,用于检查条件是否为真,如果条件不正确,则强制您立即退出当前范围。 这通常用作防护让,它检查可选选项是否具有值,如果有,则为该可选值创建一个新的常量,以便可以安全地使用它。 如果没有值,则保护条件失败,您必须退出当前作用域。

h

  • Hashable(可散列):一种通用的Swift协议,其中规定可以使用散列值表示符合类型。
  • Higher-order function(高阶函数):一个函数,该函数接受另一个函数作为参数,或者将一个函数作为其返回值发送回去。

i

  • if let:一种Swift语法,用于检查可选参数是否具有值,如果存在,则为该可选参数的值创建一个新常数,以便可以安全地使用它。如果没有值,则if条件失败,您可以改为运行else块。
  • Implicitly unwrapped optional(隐式解开的可选):一种特殊的Swift可选,可能包含也可能不包含值,但在使用前无需进行检查。如果您尝试使用没有值的隐式展开的可选内容,则您的应用程序将崩溃。
  • Indirect enum(间接枚举):经过特殊编译的枚举,以便可以在其关联值中引用自身。例如,如果您有一个链接列表枚举,需要将另一个链接列表项作为关联值引用,则此列表必须是间接的。
  • Infinite loop(无限循环):直到您这样说,循环永远不会结束。这通常是通过将布尔变量设置为true来完成的-您可以在希望循环结束时立即将其设置为false。
  • Initializer(初始化程序):一种特殊的方法,用于创建结构或类的实例。您可以有许多初始化程序,对于类,可以在您自己的初始化程序中调用父初始化程序。
  • inout parameter:一个函数参数,当在函数内部更改时,仍然在函数外部更改。
  • Integer:整数,例如5、55或5500万。

ķ

  • Keypath(关键路径):一种无需实际读取即可引用属性的方法。
  • Keyword:作为Swift构造具有特定含义的任何单词,例如class,continue和try。

l

  • Labeled statement(带标签的语句):附加到特定代码块(例如循环或条件)的名称,即使您位于其他代码块中,也可以使它特别地突兀。例如,如果您位于第三个循环内的循环内,则可以退出最外层的循环。
  • Lazy:将属性标记为仅在首次访问时才创建的关键字。这是一种性能优化,因为这意味着如果永不访问该属性,则永远不会完成计算其值所需的工作。
  • Library:您正在使用的代码的集合。库与框架的不同之处在于,库只是类,结构,枚举等的集合,供您随意使用。

m

  • Memberwise initializer(成员初始化器):由Swift编译器自动生成的结构的初始化器,要求所有属性必须具有值。如果在struct中实现自己的初始化程序,则Swift将不再生成成员初始化程序。
  • Method:属于结构或类的函数。
  • Model:程序中存储数据的一部分。模型视图控制器结构的一部分。
  • Multi-line strings:跨多行的字符串。 Swift中的多行字符串必须在自己的行上以三个双引号开头和结尾。
  • Mutating method:一种结构上的方法,它将改变结构的属性之一。必须使用它,因为只有可变结构体才能调用它们的变异方法。类不需要突变方法,因为类中的每个方法都可以在没有关键字的情况下进行突变。

n

  • Nested type(嵌套类型):在另一个类或结构内定义的一个类或结构。
  • Nil:Swift的缺失数据术语。没有值的可选值将设置为nil。
  • Nil coalescing:Swift中的运算符,写为??,如果有可选值,则使用可选值,否则使用默认值。
  • Non-throwing function(非抛出函数):不能抛出错误的函数。不能使用throws标记这些标记,也不能使用throw关键字。

o

  • Objective-C:苹果公司的第一款编程语言,也是Swift的先驱。
  • Operand(操作数):与运算符一起使用的值。例如,在2 + 3中,2和3是操作数。
  • Operator(运算符):在其左侧和/或右侧的值上充当函数的任何符号。例如,+是将两个值加在一起的运算符。
  • Operator overloading(运算符重载):一个运算符(例如+)根据其使用方式执行多项操作的能力。例如,1 +1是一个整数加法,但是“ Hello” +“ Paul”会将字符串连接在一起。
  • Optional(可选):一种包装其他类型的类型,例如String或Int,但增加了根本不存储任何值的功能。 “无值”不同于所有常规整数值,包括零。 Swift大量使用可选参数作为提供运行时安全性的一种方式,编译器强迫我们正确使用它们。
  • Optional chaining(可选链接):在一行代码中使用多个可选方法或属性的能力。如果它们中的任何一个为零,那么该行的执行将停止,但是如果它们全部成功,则将返回一个可选值。例如,用户?.name?.uppercased()。
  • Override method(覆盖方法):类的方法,其名称,参数和返回类型与该类的父类的方法相同。 overlay关键字告诉Swift编译器您了解您正在更改行为。

p

  • Parameter:已传递到函数中的值的名称,将在函数内部使用。例如,在func sayHello(to:String)中,to部分是一个参数。
  • Parameter label(参数标签):分配给影响其在外部使用方式的功能参数的自定义名称。例如,在sayHello(to name:String)中,调用该函数的人会说sayHello(to:“ Paul”),但是在函数内部您将引用name。
  • Parenthesis(括号):用于打开和关闭圆括号(和)的名称。
  • Polymorphism(多态性):对象显示为多种不同类型并用作多种类型的能力。例如,如果您已将Labrador类实例定义为父类,则它们也可以用作Dog and Mammal。
  • Property(属性):属于类,结构或枚举的常量或变量。
  • Property observer(属性观察者):使用willSet和didSet添加到属性的代码,每当更改属性时都会调用该代码。
  • Property wrapper(属性包装器):围绕属性设置的属性,可为其提供自定义功能。例如,您可以编写一个@UserDefaults属性包装器,以简化将数据加载和保存到用户默认值的过程。
  • Protocol(协议):类型必须符合的条件列表,例如属性名称和方法。协议允许我们以相同的方式对待许多对象,因为它们实现了使协议起作用所需的所有行为。
  • Protocol extension :一组添加到协议中的其他方法和计算属性,例如Equatable。
  • Protocol inheritance:一种协议从另一协议继承需求的能力。例如,可比较协议继承自Equatable。
  • Protocol-oriented programming(面向协议的编程POP):一种编程方法,该方法支持通过协议扩展来重用代码,从而提供了多重继承的好处,而又没有一些复杂性。特别是,面向协议的编程(POP)不能将存储的属性添加到类型中,因此减少了麻烦。

r

  • Range:范围跨越两个值之间的距离,最大到有时包括最终值。这主要用于数字:1 .. <4包括数字1、2和3,而范围1 ... 4包括数字1、2、3和4。范围也可以从其他数据中得出类型,例如日期。
  • Raw strings:可以在需要使用反斜杠和引号而又没有常规含义的情况下指定自定义字符串定界符的功能。
  • Raw value:可以将枚举值映射到的简单基础数据类型,以进行加载和保存。例如,您可能会说水星,金星和地球这两个行星的原始原始值为1、2和3。
  • Reference type :将数据间接存储在内存中的任何类型,变量或常量实际上只是该内存的指针(或引用)。如果将第二个变量指向引用类型,则它将指向与原始引用相同的内存数据,因此该数据是共享的。
  • Repeat loop:只要条件为真,就会继续执行的循环。如果其条件开始为假,它将至少执行一次。
  • Rethrowing functions(重新抛出函数):使用rethrows关键字的函数,以便仅当它接受的闭包抛出错误时才抛出错误。
  • Return type:函数表示将返回的数据类型。 Swift总是强制执行此操作,因此如果您说要返回一个字符串,则必须这样做。
  • Runtime:代码运行时,而不是编译时,即代码构建时。

s

  • Scope:变量和常量有效的代码区域。每次使用右括号时,都会启动一个新的作用域:所有先前的变量和常量在该作用域中均保持有效,但是在该作用域内声明的所有变量和常量仅在该作用域以右括号结束之前才有效。
  • Selector:一种在不实际调用函数的情况下引用函数的方法,通常用于以后调用它们的目的。
  • Serialization:将对象转换为文本或二进制,反之亦然的过程。例如,将用户数组转换为JSON,或将JSON转换为用户数组。
  • Set:符合哈希协议的任何类型的高性能,无序值集合。
  • Shorthand parameter name(速记参数名称):闭包中可用的特殊参数名称,用美元符号表示,数字从0开始。例如,如果闭包接受名称字符串和年龄整数,则可以将字符串称为0,将年龄称为 1。注意:您不能将速记语法与常规语法混用和匹配。
  • some:使用不透明返回类型的关键字–返回类型,例如SwiftUI中的某些View表示“将返回某种View,但具体哪种类型无关紧要”。
  • Statement:执行某种动作的一些代码,例如print(age)。
  • Static method:一种在结构或类的所有实例之间共享的方法,而不是每个实例都唯一。因为它不是在结构或类的特定实例上运行,所以它无法访问未标记为静态的任何属性。
  • Static property:在结构或类的所有实例之间共享的属性,而不是每个实例都唯一。
    StaticString:Swift的String的一种特殊形式,必须手工键入-您必须直接将字符串直接键入代码中,而不是使用字符串插值。
  • String:字母的集合,例如“ Hello”。
  • String interpolation:Swift将变量和常量的值插入字符串的能力,例如“ Hello,\(name)”。
  • Struct:一种自定义数据类型,可以具有一个或多个属性以及一个或多个方法。与类不同,结构是值类型。
  • Subscript:与集合一起使用的特殊方法,可轻松访问集合中的读取和写入值。例如,someArray [3]是下标,someDictionary [“ name”]也是如此。
  • Switch case:一种在一个代码块中评估多个条件的系统。例如,您可以使用switch age来评估age变量,然后使用0到10、10到20、20到30的个案,依此类推。开关块在Swift中必须是详尽无遗的,这意味着它们必须具有覆盖所有可能值的大小写。
  • Syntactic sugar:一种特殊的Swift语法名称,旨在掩盖复杂性。该名称源于这样的想法,即最好创建简短而甜美的语法,使其与较长的语法相同。例如,[String]是Array <String>的语法糖。
  • Synthesize:Swift编译器代表您生成代码的名称。例如,如果您说一个自定义结构符合Equatable,并且其所有属性都已经符合Equatable,则Swift可以为其合成一个==函数。

t

  • Ternary operator(三元运算符):使用三个值的运算符,用Swift编写为? :。例如,isEnabled? 10:如果isEnabled为true,则100将返回10,否则为100。
  • Throwing function(投掷函数):具有抛出错误的功能的函数。这些必须在Swift中使用throws关键字进行标记,并使用try进行调用。
  • Trailing closure syntax(尾随闭包语法):接受闭包作为其最终参数的函数在函数的括号后指定闭包的能力,这通常有助于使函数调用更易于阅读。
  • try catch:运行throwing函数并捕获发生的任何错误的能力。您必须开始使用do块,然后使用try调用其中的任何throw方法,最后添加一个或多个catch块以捕获任何错误。编写catch块以捕获所有错误有时被称为Pokémoncatch,因为“您必须捕获所有东西”。
  • Tuple(元组):任何类型的值的固定大小的集合,例如匿名结构。发音为“ tyoo-pull”或“ too-pull”,有时甚至是“ tupple”。
  • Type alias:类型别名是指定哪种类型应填充关联类型的功能。通常不需要这样做,因为Swift可以通过查看与关联类型一起使用的属性来找出类型别名。类型别名在Swift中是一个字:typealias。
  • Type inference(类型推断):Swift的编译器能够确定应将哪种数据类型分配给每个变量和常量,因此您不必明确声明它。
  • Typecasting(类型转换):将一种类型的对象视为另一种类型的对象的能力。当您了解有关Swift编译器的更多信息时(例如,从情节提要中实例化视图控制器时),这是必需的。

u

  • Unwrapping optionals(解开可选项):检查可选项中是否有值,并提取该值以便安全使用的过程。

v

  • Value type(值类型):直接将其数据存储在内存中的任何类型。 如果将第二个变量指向值类型,它将始终完整复制数据,而不是允许其共享。
  • Variable(变量):代码中任何已命名的数据,在程序运行时可能会更改。
  • Variadic function(可变参数函数):一种函数,采用一个或多个特定类型的值,以逗号分隔。 print()函数是可变参数,因为您可以编写print(1)来打印单个值,或者通过print(1、2、3、4、5、6、7、8)来打印多个值。
  • View:程序的一部分,向用户显示可见的结果。 模型视图控制器结构的一部分。
  • void:缺少值。 最常用于表示什么都不返回的函数的返回类型。

w

  • While loop:只要条件为真,就会继续执行的循环。 如果其条件开始为假,则即使执行一次也不会执行。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容